是否可以过滤拖尾的输出?


11

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

Answers:


32

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

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

tail -f /var/log/syslog | grep cron

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


8
虽然这基本上是正确的,但重要的是要意识到,grep当非交互式使用它(例如它是较长的管道的一部分)时,它将缓冲。--line-buffered当无法删除管道中的grep时,GNU grep 2.5.1提供了解决此问题的选项。(当我说grep将缓冲时,我的意思是直到缓冲达到4k为止,您才会看到输出。)
kojiro 2011年

为了补充前面的评论,现代Linux下的“ tail -f”将循环运行,等待syslog文件中的更多输入。要使命令实际上以文件中存在的内容完成,请省略-f开关:tail / var / log / syslog | grep cron
Gnudiff 2011年

7
tail -f /var/log/messages | grep "myfilterword"

希望能有所帮助。


4

这是另外一些想法,虽然不那么简单,但可能会提供一些有趣的附加灵活性:

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

tail -f /var/log/messages | awk '/myfilterword/'

与使用的示例完全相同grep。您可以使用awk的功能对此进行扩展,例如:

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

这将打印输出的第6至最后一个字段(字段之间用空格隔开)

另一个类似的想法是使用perl单线:

tail -f /var/log/messages | perl -ne "/myfilterword/ and print"

完全像grep。也许您需要一个行号计数器和仅第6个字段?这个怎么样:

tail -f /var/log/messages | \ 
perl -lane "/myfilterword/ and printf \"%6d %s\n\",++\$a,\$F[6]"

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


+1关于如何进一步扩展而不是grep的详尽说明!
pablo

2

另一个值得注意的技巧是,如果您的CSV文件带有要忽略的标题,例如:

% cat data.txt
fruit        dessert        calories
Apple        Pie            770
Banana       Pudding        625
Cherry       Cobbler        990
% tail -n +2 data.txt
Apple        Pie            770
Banana       Pudding        625
Cherry       Cobbler        990

不管输入多长时间tail+n -2都会省略第一行。

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.