[英]Quickly find last N occurrences of string in huge file in Linux
我正在使用一个生成巨大日志文件的应用程序(每天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
,而输入文件的其余部分根本不需要读取。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.