tail -f path


上面的内容将立即输出对文件的修改,但是我想对输出应用过滤器,仅在其中包含关键字xxx时显示。解决这个问题?

评论

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

#1 楼

在Unix中,您可以将一个程序的输出通过管道传递到另一个程序中。

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

tail -f path | grep your-search-filter


评论


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

–TraderJoeChicago
2011年11月7日15:12

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

– AddersUK
2011-11-25 23:19



我以为这没用,直到我意识到grep区分大小写。 grep -i将使其不区分大小写。

–基特·约翰逊(Kit Johnson)
20年6月3日在23:41

#2 楼

简短答案: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 }'



现在您想知道输出到哪里去了...根据日志量,您可能会发现确实得到了输出,但是一次将一页,因为现在grep的标准输出在全缓冲模式下运行方式,因此awk一次接收到它的输入4kB(默认情况下)。

在这种情况下,您可以告诉grep使用--line-buffered选项始终使标准输出行缓冲。 br />
tail -F -n0 somefile | grep --line-buffered somepattern | ...


但是,大多数命令都没有--line-buffered的类似物。如果使用更多可编写脚本的工具,则可以使用函数来刷新输出(例如,在awk中,该函数是fflush(),该名称与C语言同名,Perl和Python之类的工具也有类似的用法)。 />
对于cut之类的产品,您可能很不幸。 ...但是您可以尝试搜索unbuffer,这是我认为expect工具链提供的功能(我从未使用过)。 >
干杯,
Cameron

评论


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

–绿色
17年9月11日15:17

#3 楼

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

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

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

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