I want to display the last 10 lines of my log file, starting with the last line- like a normal log reader. I thought this would be a variation of the tail command, but I can't find this anywhere.
5 Answers
GNU (Linux) uses the following:
tail -n 10 <logfile> | tac
tail -n 10 <logfile>
prints out the last 10 lines of the log file and tac
(cat spelled backwards) reverses the order.
BSD (OS X) of tail
uses the -r
option:
tail -r -n 10 <logfile>
For both cases, you can try the following:
if hash tac 2>/dev/null; then tail -n 10 <logfile> | tac; else tail -n 10 -r <logfile>; fi
NOTE: The GNU manual states that the BSD -r
option "can only reverse files that are at most as large as its buffer, which is typically 32 KiB" and that tac
is more reliable. If buffer size is a problem and you cannot use tac
, you may want to consider using @ata's answer which writes the functionality in bash.

- 1
- 1

- 9,031
- 15
- 81
- 85
-
I'm sure this is right, but looks like the 'tac' command doesn't exist on OSX shell... – Yarin Nov 05 '11 at 01:38
-
@Yarin See http://stackoverflow.com/questions/742466/how-can-i-reverse-the-lines-in-a-file for some alternatives to `tac`, not all of which are portable. – ephemient Nov 05 '11 at 03:57
-
Sorry, I have to ding you for "useless use of cat" http://www.smallo.ruhr.de/award.html since tail has the option -r to reverse the order. So `tail -r -n 10
` is the better choice. As a bonus tail -r works on non-GNU systems like OSX, Solaris, AIX, etc. – Bruno Bronosky Dec 03 '14 at 20:45 -
@RichardBronosky Nice link, I've edited my answer to also include the `-r` option. – Rick Smith Dec 03 '14 at 21:52
-
@RickSmith respectable humility, friend. I received the award in 1999 and have been diligent ever since. Also, I was GNU-only from 1995-1999 before getting plunged into Posix systems and had to relearn a lot because the admins refused to install all the sugar I was used to. – Bruno Bronosky Dec 04 '14 at 03:01
-
GNU tail does not have the `-r` option, see https://www.gnu.org/software/coreutils/manual/html_node/tail-invocation.html#index-BSD-tail – m13r Aug 05 '16 at 12:00
I ended up using tail -r
, which worked on my OSX (tac
doesn't)
tail -r -n10

- 173,523
- 149
- 402
- 512
-
This is the best answer because it is not GNU specific and avoids a "useless use of cat". http://www.smallo.ruhr.de/award.html – Bruno Bronosky Dec 03 '14 at 20:47
-
1Does not work `root@elk:/# tail -r -n1 /var/log/logstash-test-output.log tail: invalid option -- 'r'` – basickarl Feb 26 '16 at 15:56
-
2@KarlMorrison This won't work for non-BSD tail commands. See [my answer](http://stackoverflow.com/a/8017478/616644) for more help... – Rick Smith Aug 16 '16 at 18:47
You can do that with pure bash:
#!/bin/bash
readarray file
lines=$(( ${#file[@]} - 1 ))
for (( line=$lines, i=${1:-$lines}; (( line >= 0 && i > 0 )); line--, i-- )); do
echo -ne "${file[$line]}"
done
./tailtac 10 < somefile
./tailtac -10 < somefile
./tailtac 100000 < somefile
./tailtac < somefile

- 2,045
- 1
- 14
- 19
This is the perfect methods to print output in reverse order
tail -n 10 <logfile> | tac

- 37,187
- 64
- 214
- 335

- 21
- 1