如何将过滤器应用于`tail -f`的实时输出?


60
tail -f path

上面的内容将立即输出对文件的修改,但是我想将过滤器应用于输出,仅在其中有关键字时显示xxx

如何处理呢?


1
将答案标记为接受可以帮助阅读您的问题和答案的其他人知道,如果他们有类似的问题,则更可能帮助他们。您可以通过单击用户名来重新访问以前的问题。
丹尼斯·威廉姆森

Answers:


84

使用Unix,您可以将一个程序的输出传递到另一个程序。

因此,要过滤尾巴,可以使用grep:

tail -f path | grep your-search-filter

但是,假设您在文件尾(文件末尾)有100行,而这些行就是您要过滤的行。您的解决方案
TraderJoeChicago 2011年

1
如果只想搜索文件的最后100行,请尝试tail -100 path | grep xxx
AddersUK

15

简短答案: tail -f somefile | grep somepattern

但是,这往往不足。假设您要跟踪一个经常旋转的文件(如果是调试日志,它可能会旋转多次)。那tail -F是你的朋友。我让你看看区别。

tail -ftail -F打印出一堆第一线,这是在这个用例往往不受欢迎,所以在这种情况下,加-n0

tail -F -n0 somefile | grep somepattern

没问题,直到您想要进行其他过滤,然后才需要注意缓冲。默认情况下 stdout 在写入终端时是行缓冲的,但在写入管道时是全缓冲的。因此,以下内容将在找到行后立即发出,因为它们tail是显式行缓冲的(或者在每行的末尾刷新其输出),并且grep也是行缓冲的,因为其输出将发送到您的终端:

tail -F -n0 somefile | grep somepattern

但是随后您决定使用类似的东西awkcut进一步处理输出。

tail -F -n0 somefile | grep somepattern | awk '{print $3}'

现在您想知道输出到哪里去了...根据日志量,您可能会发现确实得到了输出,但是一次却要一页,因为现在stdout grep是以完全缓冲的方式运行的,因此一次awk收到输入4kB(默认)。

在这种情况下,您可以grep使用该--line-buffered选项告诉总是使stdout行缓冲。

tail -F -n0 somefile | grep --line-buffered somepattern | ...

但是,大多数命令都没有的类似物--line-buffered。如果使用更多可编写脚本的工具,则可以使用函数来刷新输出(例如,在中awk,函数为fflush(),与C语言同名,Perl和Python之类的工具也有类似的用法)。

cut你这样的人可能很不幸。...但是您可以尝试搜索unbuffer,这是我认为expect工具链提供的功能(我从未使用过)。

我希望您发现这很有用。

干杯,卡梅伦


我真的很欣赏关于为什么它在行缓冲模式下起作用的解释。这是一个极好的见解,谢谢。
绿色

2

而且您可以使用多个管道和垃圾,并使用grep -v排除某些内容,使用grep -i区分大小写,等等。

即:tail -100f / var / log / messages | grep -V ACPI | grep -i ata

从结尾开始拖尾100行,并保持拖尾,首先排除任何具有ACPI的行,然后显示具有ata,ATA或它们的任何组合的行。

另一个方便的选项是ABC选项,用于After,Before和Context行(之前和之后的行)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.