![如何读取巨大日志文件的最后几行?](https://linux22.com/image/229340/%E5%A6%82%E4%BD%95%E8%AF%BB%E5%8F%96%E5%B7%A8%E5%A4%A7%E6%97%A5%E5%BF%97%E6%96%87%E4%BB%B6%E7%9A%84%E6%9C%80%E5%90%8E%E5%87%A0%E8%A1%8C%EF%BC%9F.png)
我有一个 55GB 大小的日志。
我试过:
cat logfile.log | tail
但这种方法需要花费很多时间。有没有办法更快地读取大文件或任何其他方法?
答案1
cat logifle.log | …
这是多余的,实际上会导致速度变慢。tail logfile.log
没有猫会更有意义!
它会快得多,因为当输入不是可寻找的,tail
需要做的是逐行读取所有标准输入,将最后 10 行保留在缓冲区中(以防它们应该是最后的10 行);并且让输入来自通过cat
机制的管道,确保它不可查找。
这很慢,除非文件中的一行可以有 GB 大小,否则非常愚蠢:只需跳过前 54.9 GB。剩下的100MB肯定不会少于最后10行!从 100 MB 中获取最后 10 行应该足够快了。
tail --bytes 100M logfile.log | tail
然而,如果您使用的是 GNU Coreutil1 的tail
实现,那么它已经做到了这一点(即,它会查找文件末尾减去 2.5 kB 的内容,并从那里开始查找)。经过不是在这里滥用cat
但让tail
读取文件本身(或者只是使用重定向,效果是一样的!),您会得到更快的结果。
tail
1 GNU Coreutils、现代 busybox 是我检查过的两个实现;两者都这样做。 Stéphane 在下面指出,即使是原来的20 世纪 70 年代 PWB Unix 实施做到了这一点——但这仍然只是一个实现细节。
答案2
您应该直接使用tail logfile
来获取文件的最后十行,而不是像cat logfile | tail
现在这样读取所有文件。
答案3
tail -nX path to your log file
对于 X,使用您想要读取的行数。
例子
tail -n30 /var/log/syslog
显示我的 /var/log/syslog 的最后 30 行
答案4
您可以使用tac
,这是cat
向后的。但不要这样做,因为很难将其限制为 10 行。请使用tail
它,因为这就是它的用途。