在Linux中快速查找巨大文件中最后N次出现的字符串

时间:2014-10-21 04:31:12

标签: linux

我正在使用生成巨大日志文件的应用程序(每天2.5GB)。有时,我需要通过在日志中搜索选择字符串来收集有关应用程序状态的信息。

这是在一个小型CentOS Linux系统上运行的,因为它是一个生产环境,我想尽量减少这类搜索的CPU负载。

在大文件中查找最后50次字符串的最有效方法是什么?我能想出的最快的是:

tac file.log | grep 'some string' -m50 | tac

这是否和我一样快或者有更好的选择?

另外,为什么这么快?我期待着" tac"反转整个文件导致性能降低,但情况似乎并非如此。

更新

示例场景:假设应用程序每5分钟记录一次有关其内存利用率的统计信息。如果我想看看过去一小时的趋势,我现在会做这样的事情:

tac file.log | grep 'Memory' -m12 | tac

1 个答案:

答案 0 :(得分:3)

你拥有的是好的。 tac不慢的原因是它不需要读取整个文件并将其反转。相反,它可以寻找文件的最后一个字节并从那里向后读。一旦您的grep找到足够的行,它就会停止,SIGPIPE将在第一个tac中出现,而输入文件的其余部分根本不需要读取。