尾随日志文件,但仅显示特定行


29

我要在日志文件中添加-f标志。然后,我将其传递给grep,以仅查找包含“ X”的行。一切正常。现在,我想再次将此管道输送到另一个grep中,这将删除所有包含“ Y”的行。当我添加第二个管道时,文件停止刷新,看起来没有数据。

这是有效的命令: tail -f my_file.log | grep "X"

这是没有的命令: tail -f my_file.log | grep "X" | grep -v "Y"

我应该如何构造它以便命令起作用?


1
尝试一管接一管,更改顺序,执行tail -f file|grep -v "Y"。如果输出正常,则继续追加grep "X"
Aizuddin Zali 2015年

Answers:


38

由于grep缓冲了的输出,请使用--line-buffered选项grep来启用行缓冲:

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'

1
我想知道如何stdbuf告诉libstdbuf.so要使用的设置。
卡巴斯德(Kasperd),2015年

@kasperd:环境变量。
Nate Eldredge,2015年

1
@NateEldredge我已经在输出中查找环境变量,但diff -u <(env) <(stdbuf env)没有发现。但是现在我意识到我应该测试的是diff -u <(env) <(stdbuf -oL env)
卡巴斯德(Kasperd),2015年

我也是同样的问题。我的情况是,我需要打印所有包含“ aaa”和“ bbb”的行。以上第一个解决方案不起作用。第二种解决方案是针对“ aaa”存在和“ bbb”不存在而工作。两者都不存在。没有输出。我的命令如下所示: tail -f test.txt | stdbuf -oL grep 'aaa' | grep 'bbb' 它不提供任何输出。请你帮助我好吗。
太阳

18

我通常发现awk对于这些逻辑检查更有用:

tail -f /path/to/log | awk '/X/ && !/Y/'
#                           ^^^    ^^^^
#                   this I want    but not this

通过具有两个选项卡进行测试,其中一个选项卡我保持书写seq 20 >> myfile,而另一个选项卡具有例如tail -f myfile | awk '/3/ && !/13/'


15

另一种方法是使用单个grep调用而不是两个调用,从而避免出现缓冲问题。只需使用正则表达式匹配包含0个或多个非Y字符的行,然后依次匹配X和0个或多个非Y的行,直到该行的末尾即可。”

tail -f /path/to/log | grep '^[^Y]*X[^Y]*$'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.