慢速grep的替代品

时间:2013-03-17 00:03:52

标签: unix command-line grep

目前我有一个系统日志(在这种情况下为Growl.app),我不时会看到它。 我使用grep过滤掉我不希望看到的行。

cat /Users/Daniel/Library/Logs/Growl.log | grep -vE 'registered|Display frame|Reserving|Used rects|Beginning a pass|Successfully reserved|Adjusted display frame|---|User went idle|User returned|positionDisplay|primaryDirection|Bowtie:|secondaryDirection' | tail -20 > /Users/Daniel/Library/Logs/Growl-log.txt
sleep 2
qlmanage -p /Users/Daniel/Library/Logs/Growl-log.txt

我不确定是否有更好的方法来过滤掉信息,但因为我的脚本需要花费相当多的时间来处理该命令。我不妨添加我的硬件肯定不会阻止它。需要注意的另一件事是'qlmanage'部分是一个特定于OS X的命令,它在“快速查看”窗口中显示文本文件的内容。它在显示请求时是即时的。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您要求系统读取一个非常大的,可能在不断增长的文件,根据大量搜索删除一堆记录(每个替换:| z | c | V ..etc)。每当你要求它运行时,它必须翻阅更多的记录。

日志是否有时间戳?结合时间戳(甚至更好,尾巴),grep,你可以在一个小得多的文件中每天或每小时为你运行一个你想要的工作。

基本上你不能在几秒钟内完成你所要求的所有100的MB读取。让我们从tail开始,它通过定位文件指针而不是读取整个文件来工作。更快。

tail -20000 /Users/Daniel/Library/Logs/Growl.log | 
grep -vE 'registered|Display frame|Reserving|Used rects|Beginning a pass|Successfully reserved|Adjusted display frame|---|User went idle|User returned|positionDisplay|primaryDirection|Bowtie:|secondaryDirection' |
> /Users/Daniel/Library/Logs/Growl-log.txt
qlmanage -p /Users/Daniel/Library/Logs/Growl-log.txt

调整20000以获得通过过滤器的合理数量的样本。换句话说,prefilter该文件会删除您将要投球的早期记录。

另一个加速是做一个积极的搜索 - grep你想要的,而不是你不想要的。

祝贺你。你还获得了UUOC奖。试试谷歌先生的UUOC一词(与猫有关)。在他们了解之前,每个人都赢得了奖项