tail -f의 이중 grep은 출력을 제공하지 않습니다.

tail -f의 이중 grep은 출력을 제공하지 않습니다.

다음과 같이 파일을 추적하면:

tail -f  /var/log/syslog|grep s

"s"가 포함된 모든 줄이 표시됩니다.

다시 동일한 "s"로 grep하면 왜 출력이 나오지 않습니까?

tail -f  /var/log/syslog|grep s|grep s

답변1

--line-bufferedRubo77이 언급했듯이 첫 번째 grep 명령에 다음 명령을 추가하면 문제를 해결할 수 있습니다.

tail -f  /var/log/syslog|grep --line-buffered s|grep s

grep그런데 왜 단일 명령으로 이 작업을 수행할 필요가 없는 걸까요? 이 둘의 차이점은 다음 명령입니다.

tail -f  /var/log/syslog|grep s

STDOUT터미널에 대한 grep 포인트의 경우. 대부분의 쓰기 작업은 stdio 라이브러리에 포함된 함수를 통해 수행됩니다 grep. STDOUT문서에 따르면 (표준 입력 및 출력(3)):

기본적으로 터미널 장치를 참조하는 출력 스트림은 항상 라인 버퍼링됩니다.

따라서 기본 라이브러리 호출은 각 줄 다음에 버퍼를 플러시하는 반면 grep은 아무 작업도 수행하지 않습니다.

이 명령에서:

tail -f  /var/log/syslog|grep --line-buffered s|grep s

STDIO이제 터미널 장치 대신 파이프를 입력하고 STDOUT에 쓰기 위한 grep의 라이브러리 함수는 라인 버퍼링을 사용하는 대신 이러한 쓰기를 완전히 버퍼링합니다. --line-buffered이 플래그를 사용하면 grep이 호출되어 fflush버퍼링된 모든 쓰기를 플러시합니다.

답변2

--line-bufferedgrep에 추가해야합니다

tail -f  /var/log/syslog|grep --line-buffered s|grep s

관련 정보