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

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

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


当前回答

在没有行缓冲选项的地方,使用awk(另一个很棒的bash实用程序)而不是grep!它将不断地从尾部传输数据。

这是如何使用grep的

tail -f <file> | grep pattern

这就是你使用awk的方式

tail -f <file> | awk '/pattern/{print $0}'

其他回答

你肯定不会成功

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

祝你好运

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

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

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

sed将是更好的选择(流编辑器)

tail-n0-f<file>| sed-n‘/search string/p‘

然后,如果您希望在找到特定字符串后退出tail命令:

tail--pid=$(($BASHPID+1))-n0-f<file>|sed-n'/search string/{p;q}'

显然是一种抨击:$BASHPID将是tail命令的进程id。sed命令在管道中位于tail之后,因此sed进程id将为$BASHPID+1。

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

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

在没有行缓冲选项的地方,使用awk(另一个很棒的bash实用程序)而不是grep!它将不断地从尾部传输数据。

这是如何使用grep的

tail -f <file> | grep pattern

这就是你使用awk的方式

tail -f <file> | awk '/pattern/{print $0}'