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 的管道不适用于尾部? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
Dockerfile 复制不适用于 Nextcloud 容器