grep - 需要有关另一个 grep 命令输出的 grep 帮助

标签 grep tail cat

我有一个文件 test.log。非常大的日志文件。它有不同级别的日志记录。例如,tracedebuginfowarningerror。 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/

相关文章:

regex - 需要帮助在扩展的 globbing 中混合标准

c - 在 cat 实现中以文本而不是二进制格式打印

node.js - Nodejs 向客户端生成远程 tail 和 socket-io

search - 在最后一次匹配行之后和之前的 Grep

linux - 遍历数组,使用内容作为文件输出

linux - Shell 脚本显示有问题,需要帮助

linux - 在 bash 脚本中的特定时间运行 tail -f

linux - Bash:将字符串添加到文件末尾而不换行

linux - 如何在 Bash/Grep 中转义单引号?

regex - 如何使用 sed 和 friend 打印一个区域中的所有大写单词?