【发布时间】:2011-12-22 11:30:33
【问题描述】:
我想显示我的日志文件的最后 10 行,从最后一行开始——就像普通的日志阅读器一样。我认为这将是 tail 命令的变体,但我在任何地方都找不到。
【问题讨论】:
-
你的意思是从最后一行开始,然后是最后一行-1,最后一行-2等等...?
我想显示我的日志文件的最后 10 行,从最后一行开始——就像普通的日志阅读器一样。我认为这将是 tail 命令的变体,但我在任何地方都找不到。
【问题讨论】:
GNU (Linux) uses the following:
tail -n 10 <logfile> | tac
tail -n 10 <logfile> 打印出日志文件的最后 10 行,tac(cat 倒写)颠倒顺序。
BSD (OS X) 的 tail 使用 -r 选项:
tail -r -n 10 <logfile>
对于这两种情况,您可以尝试以下方法:
if hash tac 2>/dev/null; then tail -n 10 <logfile> | tac; else tail -n 10 -r <logfile>; fi
注意: GNU manual states 表示 BSD -r 选项“只能反转最多与其缓冲区一样大的文件,通常为 32 KiB”,而 tac 是更可靠。如果缓冲区大小有问题并且您不能使用tac,您可能需要考虑使用@ata's answer,它将功能写入bash。
【讨论】:
tac 的一些替代方案,但并非所有这些都是可移植的。
tail -r -n 10 <logfile> 是更好的选择。作为奖励,tail -r 适用于 OSX、Solaris、AIX 等非 GNU 系统。
-r 选项。
tac 做你想做的事。这是cat的反面。
tail -10 logfile | tac
【讨论】:
我最终使用了tail -r,它可以在我的 OSX 上运行(tac 不能)
tail -r -n10
【讨论】:
root@elk:/# tail -r -n1 /var/log/logstash-test-output.log tail: invalid option -- 'r'
你可以用纯 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
./tailtac -10
./tailtac 100000
./tailtac
【讨论】:
这是反向打印输出的完美方法
tail -n 10 <logfile> | tac
【讨论】: