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.
I ended up using tail -r
, which worked on my OSX (tac
doesn't)
tail -r -n10
root@elk:/# tail -r -n1 /var/log/logstash-test-output.log tail: invalid option -- 'r'
–
Sweetscented 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.
tac
, not all of which are portable. –
Grethel tail -r -n 10 <logfile>
is the better choice. As a bonus tail -r works on non-GNU systems like OSX, Solaris, AIX, etc. –
Supernova -r
option. –
Gaskin -r
option, see gnu.org/software/coreutils/manual/html_node/… –
Naima tac
does what you want. It's the reverse of cat
.
tail -10 logfile | tac
I ended up using tail -r
, which worked on my OSX (tac
doesn't)
tail -r -n10
root@elk:/# tail -r -n1 /var/log/logstash-test-output.log tail: invalid option -- 'r'
–
Sweetscented 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
This is the perfect methods to print output in reverse order
tail -n 10 <logfile> | tac
Pure bash solution is
_tac_echo() {
IFS=$'\n'
echo "${BASH_ARGV[*]}"
}
_tac () {
local -a lines
readarray -t lines
shopt -s extdebug
_tac_echo "${lines[@]}"
shopt -u extdebug
}
cat <<'EOF' | _tac
1 one line[of] smth
2 two line{of} smth
3 three line(of) smth
4 four line&of smth
EOF
which prints
4 four line&of smth
3 three line(of) smth
2 two line{of} smth
1 one line[of] smth
© 2022 - 2024 — McMap. All rights reserved.