是否可以在连续流上使用grep?

我的意思是有点像tail-f<file>命令,但输出上有grep,以便只保留我感兴趣的行。

我尝试过tail-f<file>|grep模式,但似乎只有在tail完成后才能执行grep,也就是说永远不会执行。


当前回答

使用BSD grep(FreeBSD、Mac OS X等)时,打开grep的行缓冲模式

tail -f file | grep --line-buffered my_pattern

这看起来像是前一段时间——行缓冲区对于GNUgrep(几乎在任何Linux上都使用)都不重要,因为它在默认情况下被刷新(对于其他Unix类,如SmartOS、AIX或QNX,则为YMMV)。然而,截至2020年11月,需要--行缓冲(至少在openSUSE中使用GNU grep 3.5,但根据下面的评论,似乎通常需要)。

其他回答

你可以把这个答案看作是增强。。通常我使用

tail -F <fileName> | grep --line-buffered  <pattern> -A 3 -B 5

-F在文件旋转的情况下更好(如果文件旋转,-F将无法正常工作)

-A和-B用于在图案出现前后获取线条。。这些块将出现在虚线分隔符之间

但对我来说,我更喜欢做以下事情

tail -F <file> | less

如果您想在流式日志中搜索,这非常有用。我的意思是,回头再向前看

你肯定不会成功

tail -f /var/log/foo.log |grep --line-buffered string2search

当您使用“colortail”作为tail的别名时,例如在bash中

alias tail='colortail -n 30'

你可以通过类型别名如果这个输出类似tail是colortail-n30的别名。那你就有你的罪魁祸首了:)

解决方案:

使用删除别名

unalias tail

确保通过此命令使用的是“real”尾部二进制文件

type tail

它应该输出如下内容:

tail is /usr/bin/tail

然后可以运行命令

tail -f foo.log |grep --line-buffered something

祝你好运

没有看到任何人为我提供了通常的帮助:

less +F <file>
ctrl + c
/<search term>
<enter>
shift + f

我更喜欢这样,因为您可以随时使用ctrl+c停止并浏览文件,然后只需按shift+f返回实时流式搜索。

我一直使用tail-f<file>|grep<pattern>。

它会等到grep刷新,而不是等到它完成(我使用的是Ubuntu)。

如果你想在整个文件中找到匹配项(而不仅仅是尾部),并且你想让它坐下来等待任何新的匹配项,这很好:

tail -c +0 -f <file> | grep --line-buffered <pattern>

-c+0标志表示输出应该从文件开头(+)开始0字节(-c)。