多个grep管道(包含+排除)导致无法显示任何内容

时间:2016-05-22 07:52:57

标签: linux grep

目前我正在尝试tail一个日志,但只显示包含一些关键字的行。目前我正在使用

tail -F file.log | grep -ie 'error\|fatal\|exception\|shutdown\|started'

我得到了预期的结果:(例如)

10:22 This is an error
10:23 RuntimeException: uncaught problem

我还希望排除包含<DATATAG>的行,即使关键字插入其中,因为它包含大量混乱我的日志的二进制数据。我正在尝试添加另一个排除标记的grep:

tail -F file.log | grep -ie 'error\|fatal\|exception\|shutdown\|started' | grep -vF '<DATATAG>'

然而,这次没有出现任何行,甚至没有出现'错误'/'异常'而不是<DATATAG>的行。当我单独尝试排除grep时:

tail -F file.log | grep -vF '<DATATAG>'

显示所有行,包括那些包含“错误”/“异常”的行。

我做错了吗?

1 个答案:

答案 0 :(得分:1)

你的问题是缓冲问题。 grep是一个棘手的工具。从手册页:

By default, output is line buffered when standard output is a terminal and block buffered otherwise.

在您的示例中,第一个grep在块级缓冲,因此它不会将输出转换为第二个grep一段时间。解决方案是使用--line-buffered选项看起来像:

tail -F file.log | grep --line-buffered -ie 'error\|fatal\|exception\|shutdown\|started' | grep -vF '<DATATAG>'