
한 디렉터리에 여러 로그 파일이 있고 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