我想跟踪一个文件,但只输出包含特定字符串的行。这可能吗?
答案1
使用 grep。它就是为此目的而构建的。
要从 /var/log/syslog 的尾部查找包含“cron”的行,只需运行:
tail -f /var/log/syslog | grep cron
而且由于它接受标准输入上的任何内容,您也可以在任何其他命令的输出上使用它,通过与上面相同的方式进行管道传输(使用 | 符号)。
答案2
tail -f /var/log/messages | grep "myfilterword"
希望有所帮助。
答案3
这里还有其他一些想法,虽然不那么简单,但可能会提供一些有趣的额外灵活性:
首先,您可以使用 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。
答案4
另一个值得注意的技巧是,如果您有一个包含要省略的标题的 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
都会省略第一行。