获取与多个文件中的模式匹配的最后几行

Das*_*h83 4 grep awk text-processing sort cut

我有一个应用程序将一组日志文件输出到这样的中央目录:

/tmp/experiment/log/    
??? node01.log
??? node02.log
??? node03.log
??? node04.log
??? node05.log
??? node06.log
Run Code Online (Sandbox Code Playgroud)

在每个文件中,在每个日志进程的生命周期内采取不同的措施,所以这些行看起来像这样:

prop1=5, ts=X, node01
prop2=3, ts=X, node01
prop1=7, ts=Y, node01
...
Run Code Online (Sandbox Code Playgroud)

我正在努力编写一些可以处理所有文件并输出给定​​属性的最后读取的命令,理想情况下输出如下内容:

node01, prop1=7, ts=...
node02, prop1=9, ts=...
node03, prop1=3, ts=...
Run Code Online (Sandbox Code Playgroud)

有什么建议?我开始使用grep, cut,的组合sortuniq如下所示:

$ grep -sirh "prop1" /tmp/experiment/log/ | \
   cut --delimiter=, --fields=1,4 | uniq | sort | \
   tail -n 14`  --this example had 14 log files
Run Code Online (Sandbox Code Playgroud)

但它只是部分工作,因为在某些实验中它最终会打印同一日志的多个记录并排除一些其他日志。

我继续讨论awk这个:

$ awk -F":" '/prop1/ { print $NF $2}' /tmp/experiment/log/node*.log | \
   awk 'END { print }'
Run Code Online (Sandbox Code Playgroud)

并且有一个问题,当我传递多个输入文件时,它只给我最后一个日志文件的最后一行,而不是每个日志文件的 1 个输出行。

关于如何实现这一点的任何建议?

JJo*_*oao 8

看看ENDFILE块(awk特定于GNU )。你可以运行一些类似的东西

awk     'BEGINFILE { a = ""}
         /prop1/   { a=$NF $2 $1}    ## Change this if necessary
         ENDFILE   { if (a != "") print FILENAME, a}' ./node*.log
Run Code Online (Sandbox Code Playgroud)

  • 这就像一个魅力!非常感谢。我试图使用一些开始/结束代码来实现它,但我认为这适用于整个 awk 程序,我真的希望它分别应用于每个文件。 (2认同)