【问题标题】:need help with grep on output of another grep command在输出另一个 grep 命令时需要 grep 帮助
【发布时间】:2011-02-03 18:51:45
【问题描述】:

我有一个文件 test.log。非常大的日志文件。它具有不同级别的日志记录。例如,tracedebuginfowarningerror

显然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"

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

我做错了什么?以及如何获得我想要的过滤后的“tail & follow”输出。

感谢您的帮助。

(顺便说一句,我正在使用 cygwin ......如果这有任何影响)

【问题讨论】:

    标签: grep tail cat


    【解决方案1】:

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

    许多grep 变体都有一个开启行缓冲模式的开关,该模式将单独输出每行 - 有一些性能损失。例如GNU grep 有一个--line-buffered 选项来实现这个效果。

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

    【讨论】:

      【解决方案2】:

      您的代码运行良好,只是遇到了缓冲延迟。所以你会看到很长一段时间什么都没有,然后是短暂的大量文本,然后是另一个等待。阅读 http://perl.plover.com/FAQs/Buffering.html 了解正在发生的事情。

      【讨论】:

        【解决方案3】:

        tail -f 跟随文件的“新传入行”。周期性输出永远不会到达管道grep 命令(至少在tail 终止之前不会)。

        要定期“跟踪”这些日志文件中的更改,您可能需要改用 watch

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

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

        【讨论】:

        • 但根据您的解释,tail -n 20 test.log | grep -v trace 应该也不能正常工作,但使用 1 grep 的尾部管道可以工作。但是 2 个连续的管道 grep 不起作用。
        • @bits 必要的更改是从 tail -ftail -n。我的示例适用于一个,更不用说 200 个链式 greps...
        猜你喜欢
        • 2021-04-17
        • 2016-09-29
        • 1970-01-01
        • 1970-01-01
        • 2014-08-05
        • 2012-07-31
        • 1970-01-01
        • 1970-01-01
        • 2018-02-23
        相关资源
        最近更新 更多