Grep 在一个巨大的日志文件 (> 14 GB) 中只有最后一个 x GB?

Rog*_*ger 34 linux log-files grep

我需要在一个巨大的日志文件(超过 14 GB)中搜索一些东西。我很确定它在最后 4 GB 左右。

有没有办法跳过第一个 X GB 来加快速度?

use*_*517 75

我想您可以使用tail仅通过使用-c开关输出最后 4GB 左右

-c, --bytes=[+]NUM
输出最后 NUM 个字节;或使用 -c +NUM 以每个文件的字节 NUM 开头输出

您也可以通过设置和ing 到您想要开始的偏移量来使用dd做一些事情,例如bs=1skip

dd if=file bs=1024k skip=12g | grep something
Run Code Online (Sandbox Code Playgroud)

  • 之后,您应该配置 logrotate。 (83认同)
  • 但是您的答案没有提供实现该解决方案的实际命令,这是附加值。您可以将其编辑到您的答案中,或者 OP 可以将其作为新答案发布。他们绝对不应该将它添加到问题中,这就是发生的事情。而且你绝对不应该扔掉诸如“戳鼻子”之类的绰号。 (11认同)
  • @istheEnglishway,不管你信不信,有一个例子比阅读手册页更容易(另见:stackoverflow 文档) (7认同)
  • @istheEnglishway:好吧,不,他们发布了不同的命令。 (5认同)
  • @Rogier 请在解决方案中添加答案,而不是将其添加到您的问题中。这类似于自我回答:http://serverfault.com/help/self-answer (3认同)
  • @LightnessRacesinOrbit 您需要阅读我的答案、上面的第一条评论以及可能的编辑历史记录,然后再深入了解。OP 使用 `tail -c` 实施了一个解决方案,这就是我的答案所建议的。 (2认同)

Rog*_*ger 32

我只是发布这个,因为一些评论要求它。

我最终使用的是(15 GB 文件)。它工作得非常快,为我节省了大量时间。

tail -f -c 14G file | grep something
Run Code Online (Sandbox Code Playgroud)

我还在同一个文件上做了一个非常基本的基准测试。我测试过:

grep xxx 文件
// 需要永远(> 5 分钟)

dd if=file bs=1 跳过=14G | grep xxx
// 非常快 < 1 秒

尾-c 14g | grep xxx
// 相当快 < 2 秒

tail是只是有点短。

注意:使用的后缀因命令gG异(Ubuntu 15.10)

  • @Reid 我没有。但我确实多次运行 *each* 命令。我很确定 *dd* 或 *tail* 会比 *grep*(缓存与否)显着提高速度。 (2认同)

小智 19

这不会回答标题问题,但它会做你想做的事。使用 tac 反转文件,然后使用 grep 查找您的字符串。如果您的字符串在文件中只出现一次或已知次数,则让它运行,直到找到已知出现次数。这样,如果您对文件中位置的假设不正确,它仍然会找到它。如果你想限制它,你可以使用 head 来做到这一点。head 命令将在 tac 和 grep 之间进行。

所以命令看起来像:

tac < logfile | grep myString
Run Code Online (Sandbox Code Playgroud)

  • 花了我一分钟,但后来我对双关语感到呻吟...... tac 是 cat 的反义词。 (2认同)