![패턴을 사용하여 현재 디렉터리에 있는 마지막 파일의 첫 번째 줄을 인쇄합니다.](https://linux55.com/image/145062/%ED%8C%A8%ED%84%B4%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%ED%98%84%EC%9E%AC%20%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%EC%97%90%20%EC%9E%88%EB%8A%94%20%EB%A7%88%EC%A7%80%EB%A7%89%20%ED%8C%8C%EC%9D%BC%EC%9D%98%20%EC%B2%AB%20%EB%B2%88%EC%A7%B8%20%EC%A4%84%EC%9D%84%20%EC%9D%B8%EC%87%84%ED%95%A9%EB%8B%88%EB%8B%A4..png)
한 디렉터리에 여러 로그 파일이 있고 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