打印当前目录中最后一行带有模式的文件的第一行

打印当前目录中最后一行带有模式的文件的第一行

我的目录中有多个日志文件,并且想要打印vanished最后一行具有模式的这些文件的第一行。

在打印第一行之前还可以打印日志文件的名称吗awk*.logs

答案1

像这样的东西?

for f in *.logs; do tail -n 1 -- "$f" | grep -q vanished && { printf '%s: ' "$f"; head -n 1 -- "$f"; }; done

您也可以这样做,awk但如果文件很大,效率会降低,因为您必须读取整个文件,而不仅仅是开头和结尾。

答案2

如果您只想这样做,awk这可能会让您朝正确的方向发展:

for f in *.log; do awk 'NR==1{ first_line=$0 } END { last_line=$0; print( last_line ~ /varnished/) ? "File: " FILENAME "\n" first_line : "" }' "$f"; done

for 循环可能不是必需的,但这是我能找到的使用 awk 执行此操作的最有效方法

感谢下面的评论,现在我们可以gawk按如下方式进行工作:

gawk 'FNR==1 {first = $0} ENDFILE {if($0 ~ /varnished/) print substr(FILENAME,3) ":", first}' ./*.log 

在最近的 Linux 系统上,awk是一个到gawk.例如,在最近的 Fedora 版本中就是这种情况:

# ls -l /bin/awk 
lrwxrwxrwx. 1 root root 4 Jul 13 07:55 /bin/awk -> gawk

相关内容