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 -f
和tail -F
首先打印出几行,在这种情况下这通常是不可取的,因此在这种情况下,请添加-n0
tail -F -n0 somefile | grep somepattern
很好,直到您要进行其他过滤,然后才需要注意缓冲。默认情况下,stdout在写入终端时是行缓冲的,但是在写入管道时是全缓冲的。因此,以下内容将在找到后立即发出行,因为
tail
是显式行缓冲的(或者在每行的末尾刷新其输出),并且grep
也是行缓冲的,因为其输出将发送到您的终端: tail -F -n0 somefile | grep somepattern
但是您决定使用类似
awk
或cut
的东西来进一步处理输出。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行(之前和之后的行)。
评论
将答案标记为接受可以帮助阅读您的问题和答案的其他人知道,如果他们有类似的问题,则更可能帮助他们。您可以通过单击用户名来重新访问以前的问题。