如何读取巨大日志文件的最后几行?

Yi *_* Ji 15 bash

我有一个 55GB 大小的日志。

我试过:

cat logfile.log | tail

但这种方法需要花费很多时间。有没有办法更快地读取大文件或任何其他方法?

Mar*_*ler 50

cat logifle.log | \xe2\x80\xa6这是多余的,实际上会导致速度变慢。tail logfile.log没有猫会更有意义!

\n

它会快得多,因为当输入不可查找时,tail需要做的是逐行读取所有标准输入,将最后 10 行保留在缓冲区中(以防它们应该是最后一个 10 行);并且让输入来自通过您的cat机制的管道,确保它不可查找。

\n

这很慢,除非文件中的一行可以有 GB 大小,否则非常愚蠢:只需跳过前 54.9 GB。剩下的100MB肯定不会少于最后10行!从 100 MB 中获取最后 10 行应该足够快了。

\n
tail --bytes 100M logfile.log | tail\n
Run Code Online (Sandbox Code Playgroud)\n

但是,如果您正在使用 GNU Coreutil\xc2\xb9\ 的tail实现,那么它已经执行了此操作(即,它查找文件末尾减去 2.5 kB,并从那里开始查找)。通过不在cat这里滥用,而是让其tail读取文件本身(或者仅使用重定向,效果相同!),您将获得更快的结果。

\n
\n

tail\xc2\xb9 GNU Coreutils、现代 busybox 是我检查过的两个实现;两者都这样做。St\xc3\xa9phane 在下面指出,即使最初的1970 年代 PWB Unix 实现也执行此 \xe2\x80\x93 操作,但它仍然只是一个实现细节。

\n

  • 这不仅限于 GNU `tail`。所有“tail”实现都这样做,包括[70年代PWB Unix中的原始实现](https://www.tuhs.org/cgi-bin/utree.pl?file=PWB1/sys/source/s2/tail 。C)。它是 GNU 特定的“tail --bytes 100M”。 (12认同)
  • @ilkkachu 好问题!快速检查 busybox tail.c 表明他们也这样做了! (2认同)
  • 我不明白为什么你要将两个 tail 命令连接在一起。看来 (GNU) tail 本身会向后查找,直到找到最后 10 行,即使这早于 EOF 的 2.5K。因此,“tail logfile.log”就足够了。 (2认同)
  • @phuclv,我不确定你到底指的是什么。如果你运行 `tail ... < file.txt`,那么 tail_cant_ 获取文件名,它只获取一个打开的文件描述符(无论如何,可能没有明确的文件名,因为可能有多个硬链接到文件),但它也不仅仅是一个流,而是文件的正确打开文件描述符,就像打开文件时获得的任何其他描述符一样。并且可以查找文件。这不是平台的问题,而是文件与管道的问题。 (2认同)

adm*_*stg 16

您应该直接使用tail logfile来获取文件的最后十行,而不是像cat logfile | tail现在这样读取所有文件。