我有一个文件 test.log。非常大的日志文件。它有不同级别的日志记录。例如,trace
、debug
、info
、warning
和 error
。 p>
显然,trace
级别的消息只是高速发送垃圾邮件。我想查看没有 trace
级别日志的所有消息。
所以我这样做了:
cat test.log | grep -v "trace"
效果很好。
现在我想根据某个关键字keyword1
过滤剩余的消息。
所以我这样做了:
cat test.log | grep -v "trace" | grep "keyword1"
效果很好。
现在我想持续获得相同的输出,我想用 tail -f
替换 cat
。
tail -f test.log | grep -v "trace" | grep "keyword1"
但这不起作用。我根本没有得到任何输出。
我做错了什么?我怎样才能得到我想要的过滤后的“尾部和跟随”输出。
感谢您的帮助。
(顺便说一句,我正在使用 cygwin...如果这有什么关系的话)
最佳答案
您遇到缓冲问题:出于性能原因,grep
将在其缓冲区中保留相当多的输出,并一次性输出整个 block 。这意味着,当从输入中读取一行时,一旦读取(并允许通过)更多行,grep 就会将其发送到 stdout - 这在处理日志时可能需要相当长的时间正在使用 tail -f
读入的文件。
许多 grep
变体都有一个打开行缓冲模式的开关,该模式将单独输出每一行 - 会有一些性能损失。例如GNU grep
有一个--line-buffered
选项来实现此效果。
只需将该选项(或适合您的 grep
版本的选项)添加到所有 grep
调用中,一旦添加了匹配的 like,您就会看到一些输出到日志文件。
关于grep - 需要有关另一个 grep 命令输出的 grep 帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4890379/