我的目录中有多个日志文件,并且想要打印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