grep에 대한 출력 리디렉션이 예상대로 작동하지 않습니다.

grep에 대한 출력 리디렉션이 예상대로 작동하지 않습니다.

관로

sudo ngrep -W byline -qilw 'get' tcp dst port 80 | grep -i ".*" |tee /tmp/output

또는

sudo ngrep -W byline -qilw 'get' tcp dst port 80 | grep -i ".*" > /tmp/output

/tmp/outputHTTP GET 요청을 수행하면 아무 것도 기록되지 않습니다.

리디렉션 없이 stdout에서 일부 출력을 얻을 수 있습니다. 왜?

답변1

grep유틸리티가 터미널에 연결되어 있지 않으면 출력을 버퍼링합니다. 출력 버퍼가 채워지고 플러시될 /tmp/output때까지 파일에 출력이 표시되지 않습니다 .grep

실행 되는 한 ngrep이것은 문제가 될 것입니다. 일단 ngrep종료되면 grep출력 버퍼는 종료되기 전에 플러시됩니다.

이 버퍼링은 성능상의 이유로 수행됩니다. 한 줄의 텍스트를 출력으로 플러시하는 데는 짧은 시간이 걸리지만 대량의 데이터가 포함된 경우 파이프라인 속도가 느려질 수 있습니다.

버퍼링을 끄 grep거나 라인 버퍼링을 활성화할 수 있습니다. BSD 및 GNU의 경우 grep이는 비표준 옵션을 사용하여 수행 --line-buffered되므로 다음과 같은 이점이 있습니다.

sudo ngrep -W byline -qilw get tcp dst port 80 |
grep --line-buffered -i '.*' |
tee /tmp/output

또는 grep모든 줄을 통과하므로 완전히 제거할 수 있습니다 ngrep( tee정규식 .*은 비어 있는지 여부에 관계없이 모든 줄에서 일치합니다).

관련 정보