패턴을 사용하여 현재 디렉터리에 있는 마지막 파일의 첫 번째 줄을 인쇄합니다.

패턴을 사용하여 현재 디렉터리에 있는 마지막 파일의 첫 번째 줄을 인쇄합니다.

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

관련 정보