协慌网

登录 贡献 社区

如何 “grep” 连续流?

可以在连续流上grep

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

我已经试过tail -f <file> | grep pattern但似乎只能在tail grep ,也就是说永远不会执行。

答案

使用 BSD grep(FreeBSD,Mac OS X 等)时,请打开grep

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

看起来好像前一阵子--line-buffered对于 GNU grep(几乎在任何 Linux 上使用)都无关紧要,因为它默认情况下会刷新(对于其他类似 Unix 的版本,例如 SmartOS,AIX 或 QNX,则为 YMMV)。但是,从 2020 年 11 月开始, --line-buffered (至少在 openSUSE 中使用 GNU grep 3.5 时,但根据下面的注释,通常似乎需要)。

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

它将等到 grep 刷新,而不是等到完成(我正在使用 Ubuntu)。

我认为您的问题是 grep 使用了一些输出缓冲。尝试

tail -f file | stdbuf -o0 grep my_pattern

它将 grep 的输出缓冲模式设置为 unbuffered。