需要grep帮助输出另一个grep命令

问题描述:

我有一个文件test.log。非常大的日志文件。它具有不同级别的日志记录。例如,对于tracedebug,info,warningerror需要grep帮助输出另一个grep命令

显然trace级别的邮件只是在高速垃圾邮件。我想查看没有trace级别日志的所有消息。

所以我这样做:

cat test.log | grep -v "trace" 

做工不错。

现在我想根据某个关键字keyword1过滤剩余的消息。

所以我这样做:

cat test.log | grep -v "trace" | grep "keyword1" 

做工不错。我想用代替。

tail -f test.log | grep -v "trace" | grep "keyword1" 

但这不起作用。我根本没有输出。

我在做什么错?我怎么才能得到我想要的过滤'尾随&'输出。

感谢您的帮助。

(顺便说一句,我使用的cygwin ......如果可以以任何方式事项)

您遇到缓冲问题:出于性能原因,grep将在其缓冲区中保留相当多的输出,并一次输出整个块。这意味着,当从输入中读取一行时,grep会在读取(甚至通过)更多行后将其发送到stdout--这在处理正在读入的日志文件时可能会持续一段时间使用tail -f

许多grep变种都有一个转换到开启线路缓冲模式,它会自行输出每条线路,但有一些性能损失。例如GNU grep有一个--line-buffered选项来实现此效果。

只需将该选项(或适用于您的grep版本的选项)添加到您的所有grep调用中,并且只要将匹配类似项添加到日志文件即可看到一些输出。

您的代码工作正常,你只是遇到缓冲延迟。所以你会看到很长的一段时间没有,然后短暂的一大堆文本,然后再等待。阅读http://perl.plover.com/FAQs/Buffering.html了解正在发生的事情。

tail -f遵循文件的“新进线”。周期性输出永远不会到达管道grep命令(至少不会,直到tail终止)。

要定期“跟随”,在这些日志文件的变化,你可能需要使用watch代替:

watch -n 1 -- 'tail -n 20 test.log | grep -v trace | grep keyword1' 

这将每秒更新一次(-n 1)的最后20行的日志文件。

+0

但按照你的解释`tail -n 20 test.log | grep -v trace`不应该起作用,但是用1 grep作品尾部管道。但连续2次管道故障不起作用。 – bits 2011-02-03 19:05:12

+0

@bits必然的变化是从“tail -f”到“tail -n”。我的例子与一个很好,更不用说200个链接greps ... – 2011-02-03 19:07:43