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


34

我需要在巨大的日志文件(超过14 GB)中搜索某些内容。我很确定它在最近的4 GB左右。

有没有一种方法可以跳过第一个X GB来加快速度?


7
LC_ALL=C grep可能会加快速度。
jfs

1
通过选择一个明智的grep表达式,您将能够获得很大的速度。长度未知的通配符(例如a.*thing)在某些情况下需要花费更长的时间进行评估。可能是您为错误的东西进行了优化(尽管只搜索文件的一部分永远不会受到伤害,显然-它可能不是加速的最大来源)。
Floris

Answers:


75

我猜你可以使用tail来只输出最后4GB左右的-c音频

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

您也可以通过设置和输入要开始的偏移量来对dd做一些操作,例如bs=1skip

dd if=file bs=1024k skip=12g | grep something

83
之后,您应该配置logrotate。
Gerald Schneider

3
@Rogier请在解决方案中添加答案,而不要在问题中添加答案。这类似于self-answer:serverfault.com/help/self-answer
AL

5
@istheEnglishway:嗯,不,他们发布了另一个命令。
与莫妮卡(Monica)进行的轻量级比赛

11
但是您的答案没有提供实现该解决方案的实际命令,这是附加值。您可以将其编辑为答案,或者OP可以将其发布为新答案。他们绝对不应该将它添加到问题中,那就是发生了什么。而且,您绝对不应该乱扔诸如“戳鼻子”之类的词。
与莫妮卡(Monica)

7
@istheEnglishway,不管您相信与否,都拥有一个例子,这比必须阅读手册更为轻松(另请参见:stackoverflow文档)
Pierre.Sassoulas

32

我之所以发布此内容,是因为有些评论要求这样做。

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

tail -f -c 14G file | grep something

我还对同一文件做了非常基本的基准测试。我测试了:

grep xxx文件
//永久删除(> 5分钟)

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

尾巴-c 14克| grep xxx
//很快<2秒

tail是只是有点短。

注意:使用的后缀gG每个命令的不同(Ubuntu 15.10)


您是否清除了基准测试之间的磁盘缓存?我怀疑第一个中的大部分时间都是I / O。加速应为15倍,而不是300倍。
Reid

2
@里德,我没有。但是我确实多次运行每个命令。我非常确定ddtail会大大提高速度,而不仅仅是grep(是否缓存)。
罗杰

19

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

因此,命令如下所示:

tac < logfile | grep myString

1
我来这里是写完全相同的答案。我很惊讶没有人赞成你的。
德米特里·格里戈里耶夫

2
花了我几分钟,但随后我在双关语中吟着。TAC是猫的对面。
Sammi

1
我需要深入研究应用程序/调试日志。因为它使行颠倒了,所以阅读起来并不容易;-)但是,看起来非常快。没见过tac,谢谢!
罗杰
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.