我正在使用一个生成巨大日志文件(每天2.5gb)的应用程序。偶尔,我需要通过在日志中搜索选择的字符串来收集有关应用程序状态的信息。
这是在一个小型的CentOS Linux系统上运行的,因为它是一个生产环境,所以我想最小化这种搜索的CPU负载。
在一个大文件中查找字符串最后50次出现的最有效方法是什么?我能想到的最快的是:
tac file.log | grep 'some string' -m50 | tac
这是我最快的速度还是有更好的选择?
还有,为什么这么快?我预期“tac”会反转整个文件,导致性能降低,但事实并非如此。
更新:
一个示例场景:假设应用程序每5分钟记录一次有关其内存利用率的统计信息。如果我想了解过去一个小时的趋势,我现在会这样做:
tac file.log | grep 'Memory' -m12 | tac
最佳答案
你所拥有的是好的。tac
不慢的原因是它不需要读取整个文件并反转它。相反,它可以查找到文件的最后一个字节并从那里向后读取。一旦您的grep
找到足够的行,它将停止,SIGPIPE
将在第一个tac
中被提升,并且输入文件的其余部分根本不需要读取。
关于linux - 在Linux中的大型文件中快速查找最后N次出现的字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26478929/