grep 的管道不适用于尾部? [复制]

Posted

技术标签:

【中文标题】grep 的管道不适用于尾部? [复制]【英文标题】:Piping of grep is not working with tail? [duplicate] 【发布时间】:2014-12-09 08:15:03 【问题描述】:

我正在尝试通过检查日志来调试一种方案,这是我的命令

tail -f eclipse.log | grep 'enimation' | grep  -i 'tap'

基本上我想要的是,在所有线条中,我正在打印带有动画的线条,然后在所有动画中,我希望看到带有“点击”的动画。

这是返回空结果的示例数据

*******enimation error*********TapExpand
*******enimation error*********TapShrink

这将返回空结果。

如果我运行这个命令

 tail -f eclipse.log | grep  -i 'enimation.*tap'

它返回正确的结果。有人可以向我解释一下,上述两个命令有什么区别以及为什么结果存在差异。他们看起来和我一模一样。

【问题讨论】:

绝对是该问题的副本。但我认为an answer 来自一个稍微不同的问题实际上可以更好地解释问题。 【参考方案1】:

grep 正在缓冲它的输出。要告诉 GNU grep 逐行输出输出,您需要在grep 中使用--line-buffered 选项以使其工作:

tail -f eclipse.log | grep --line-buffered 'enimation' | grep --line-buffered -i 'tap'

根据man grep

--line-buffered
    Force output to be line buffered.  By default, output is line buffered when standard
    output is a terminal and block buffered otherwise.

【讨论】:

【参考方案2】:

中间grep的输出不是终端,所以它使用块缓冲而不是行缓冲。您必须使用 --line-buffered 选项强制行缓冲。

tail -f eclipse.log | grep --line-buffered 'enimation' | grep  -i 'tap'

如果其他命令不提供此选项,您可以使用stdbuf 命令强制行缓冲,例如:

tail -f eclipse.log | stdbuf -o1 grep 'enimation' | grep  -i 'tap'

【讨论】:

【参考方案3】:

您的输出正在缓冲。试试:

tail -f eclipse.log | grep --line-buffered 'enimation' | grep --line-buffered -i 'tap'

【讨论】:

Ups,我知道我不是第一个【参考方案4】:

尝试将-E 选项添加到grep。没有它,很多反射功能都无法工作。我通常将其称为“是的,我确实知道我在做什么”选项。

【讨论】:

-1 完整的红鲱鱼。问题中没有扩展的正则表达式功能。 -E 选项是--extended-regexp 的缩写形式。来自男人:Interpret PATTERN as an extended regular expression。在这种情况下,PATTERN 是 'enimation' 并且它不会改变是否被解释为 extended-regexp -E 选项如果我们想过滤两种模式 enimation tap 可能会有所帮助,但如果我们想过滤 first enimation then 如果 tap 位于行中的任何位置,则点击...如果我们确定顺序(点击始终在 enimation 之后),则实现第一种情况的正确方法是 tail -f eclipse.log | grep -iE "enimation|tap"tail -f eclipse.log | grep -iE "enimation.*tap",所有这一切防止关于 --line-buffered 选项的性能问题。

以上是关于grep 的管道不适用于尾部? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

管道 gsutil 输出到文件

Dockerfile 复制不适用于 Nextcloud 容器

Vue如何将数组复制到本地进行编辑?为啥它适用于字符串而不适用于数组? [复制]

BigQuery“复制表”不适用于小表

发送邮件不适用于复制的数据列表

为啥数据表不适用于gridview? [复制]