目前我正在尝试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>'
显示所有行,包括那些包含“错误”/“异常”的行。
我做错了吗?
答案 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>'