다음과 같이 파일을 추적하면:
tail -f /var/log/syslog|grep s
"s"가 포함된 모든 줄이 표시됩니다.
다시 동일한 "s"로 grep하면 왜 출력이 나오지 않습니까?
tail -f /var/log/syslog|grep s|grep s
답변1
--line-buffered
Rubo77이 언급했듯이 첫 번째 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-buffered
grep에 추가해야합니다
tail -f /var/log/syslog|grep --line-buffered s|grep s