파이프라인 중간에 있는 AWK가 출력을 반환하지 않습니다.

파이프라인 중간에 있는 AWK가 출력을 반환하지 않습니다.

Apache의 모든 변경 사항에 대한 로그 파일을 처리하고 간단한 oneliner를 만들고 싶습니다.

inotifywait --format="%w%f" -rm /var/log/apache2/ | gawk '{ print }'

이것이 바로 제가 시작한 곳입니다. 그러나 출력을 더 파이프하면 출력이 나오지 않습니다.

inotifywait --format="%w%f" -rm /var/log/apache2/ | gawk '{ print }' | wc -l

어쨌든, "ls", "tail"(제가 정말로 원하는 것)을 사용하면 출력이 전혀 없습니다(다른 콘솔에서 첫 번째 명령문을 실행하면 변경 사항이 있다는 것을 압니다). stdbuf, fflush()를 추가하려고 시도했지만 아무것도 작동하지 않았습니다. 이 질문을 이해하지 못합니다! 이 온라인 사용자를 문자열 포인트로 사용할 수 있는 스크립트에 저장하고 싶습니다. 그렇지 않으면 xargs를 사용할 수 있지만 원하지는 않습니다. 어떤 도움이나 조언이라도 좋을 것입니다!

답변1

출력을 얻지 못하는 이유는 wc -l모든 출력이 소비되기 때문입니다. tee프로세스 대체와 함께 이를 사용하여 awk출력을 콘솔에 인쇄하고 다음을 통해 읽을 수 있습니다 wc.

inotifywait --format="%w%f" -rm /var/log/apache2/ | gawk '{ print }' | tee >(wc -l)

inotifywait명령이 종료되지 않지만 wc -l모든 데이터를 읽을 때까지(이 경우 파이프가 닫힐 때) 출력이 인쇄되지 않으므로 여전히 몇 가지 문제가 있습니다. 다음에서 직접 계산할 수 있습니다 awk.

inotifywait --format="%w%f" -rm /var/log/apache2/ | gawk 'BEGIN { total=0 } { print; total++; print total } END { print "final total: " total }'

관련 정보