UNIX text filters, part 2.2 of 3: head and tail

This post is part of a series

Continuing on our series of small text-filtering utilities, we have head and tail. They are very simple, but also very useful.

The head command is used to display the first few lines of a text file. For example, the command:

$ head -n 4 [file]

Prints the first 4 lines of [file]. If [file] is not specified, head reads from standard input. If the option -n 4 is not specified, the first 10 lines are shown.

One can also use the following alternative notation:

$ head -4 [file]

Of course, there is also the equivalent sed command:

$ sed 5q [file]


The tail command shows the last few lines of a specified file, or of standard input. It supports the same -n [number] (or -[number]) option where n defaults to 10.

However, for some reason, even in its standard POSIX variant, tail has some extra features. First of all, one can add a + before [number] to show all lines from the [number]-th onwards, instead of the last [number]. For example:

$ printf '1\n2\n3\n4\n5\n' | tail -n +2

As you can see, the line numbering is 1-based.

It is also possible to start at a specific byte in the text stream using the -c option:

$ echo 'Hello' | tail -c 3

Notice that the ending \n is also included in the count. The -c option also supports the +[number] notation:

$ echo 'Hello' | tail -c +2

There is also an -r option that reverses the order of the output:

$ printf '1\n2\n3\n4\n5\n' | tail -r -n 2

Perhaps the most interesting feature of tail is the -f option, which makes it stay open when the end of the file is reached, displaying in real time any lines that are sunbsequently added. It can be used like this:

$ tail -f my-log-file.log

This can be useful when the command writing to my-log-file.log is already running and it is not possible to redirect its output.

The -f option does not work when tail is reading from standard input, so technically speaking we are not in “text filter” territory anymore, but it was mentioning.


These two utilities don’t do much, but can accomplish a lot when combined with I/O redirection and other text filters.

Next in the series: rev