当前位置: 首页>>技术教程>>正文


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

,

问题描述

我要在日志文件中添加-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]*$'

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/11498.html,未经允许,请勿转载。