是否可以过滤tail的输出?

Abe*_*ler 11 unix tail

我想拖尾一个文件,但只输出其中包含某个字符串的行。这可能吗?

Rya*_*n H 33

使用 grep。它就是为此目的而构建的。

要从 /var/log/syslog 的尾部查找包含“cron”的行,只需运行:

tail -f /var/log/syslog | grep cron
Run Code Online (Sandbox Code Playgroud)

由于它通过 stdin 接受任何内容,因此您也可以在任何其他命令的输出中使用它,方法与上述相同(使用 | 符号)。

  • 虽然这基本上是正确的,但重要的是要意识到 `grep` 在非交互式使用时会缓冲,例如当它是较长管道的一部分时。当无法从管道中消除 grep 时,GNU grep 2.5.1 提供了`--line-buffered` 选项来解决这个问题。(当我说 grep 将 *缓冲* 时,我的意思是在缓冲区达到 4k 之类的值之前您不会看到输出。) (8认同)

pab*_*blo 7

tail -f /var/log/messages | grep "myfilterword"
Run Code Online (Sandbox Code Playgroud)

希望有帮助。


Phi*_*ack 5

这里有一些其他的想法,虽然并不那么简单,但可能会提供一些有趣的额外灵活性:

首先,您可以使用 awk 而不是 grep 进行过滤:

tail -f /var/log/messages | awk '/myfilterword/'
Run Code Online (Sandbox Code Playgroud)

其工作原理与使用 的示例完全相同grep。您可以使用 awk 的强大功能对此进行扩展,例如:

tail -f /var/log/messages | \
awk '/myfilterword/ { for (i=6; i<=NF; i++) printf("%s ", $i); printf("\n")}'
Run Code Online (Sandbox Code Playgroud)

这将打印输出的第六个到最后一个字段(字段以空格分隔)

另一个类似的想法是使用 perl 单行代码:

tail -f /var/log/messages | perl -ne "/myfilterword/ and print"
Run Code Online (Sandbox Code Playgroud)

其工作原理完全一样grep。也许您想要一个行号计数器和第 6 个字段?这个怎么样:

tail -f /var/log/messages | \ 
perl -lane "/myfilterword/ and printf \"%6d %s\n\",++\$a,\$F[6]"
Run Code Online (Sandbox Code Playgroud)

显然,所有这些事情也可以使用其他工具来完成,但我想说明的是,有一些有趣的方法可以使用更通用的语言,例如 awk 或 perl。