问题描述
我要在日志文件中添加-f标志。然后,将其通过管道传递给grep,以仅查找包含”X”的行。一切正常。现在,我想再次将此管道输送到另一个grep中,这将删除所有包含”Y”的行。当我添加第二个管道时,文件停止刷新,并且看起来没有数据。
这是有效的命令:tail -f my_file.log | grep "X"
这是没有的命令:tail -f my_file.log | grep "X" | grep -v "Y"
我应该如何构造它以便命令起作用?
最佳回答
由于缓冲了grep
的输出,请使用grep
的--line-buffered
选项启用行缓冲:
tail -f /path/to/log | grep --line-buffered 'X' | grep -v 'Y'
如果grep
没有该选项,则可以使用stdbuf
作为替代:
tail -f /path/to/log | stdbuf -oL grep 'X' | grep -v 'Y'
次佳回答
通常,对于这些类型的逻辑检查,我通常会找到更有用的awk
:
tail -f /path/to/log | awk '/X/ && !/Y/'
# ^^^ ^^^^
# this I want but not this
通过具有两个选项卡进行测试,一个选项卡中我继续写seq 20 >> myfile
,另一个选项卡具有例如tail -f myfile | awk '/3/ && !/13/'
。
第三种回答
另一种方法是使用单个grep
调用而不是两个调用,这样可以避免出现缓冲问题。只需使用正则表达式匹配包含0个或多个非Y字符的行,然后依次匹配X和0个或多个非Y的行,直到该行的末尾即可。”
tail -f /path/to/log | grep '^[^Y]*X[^Y]*$'