답변:
유닉스를 사용하면 한 프로그램의 출력을 다른 프로그램으로 파이프 할 수 있습니다.
따라서 꼬리를 필터링하려면 grep을 사용할 수 있습니다.
tail -f path | grep your-search-filter
짧은 답변: tail -f somefile | grep somepattern
그러나 이것은 부족한 경향이 있습니다. 자주 회전하는 파일을 마무리한다고 가정합니다 (디버그 로그인 경우 여러 번 회전 될 수 있음). 이 경우 tail -F
친구입니다. 차이점을 찾아 보도록하겠습니다.
그러나 tail -f
및 tail -F
추가이 경우, 그래서이 사용 사례에서 종종 바람직하지 않다 첫번째 라인의 무리를 인쇄-n0
tail -F -n0 somefile | grep somepattern
다른 필터링을 원할 때까지는 괜찮을 것이고 버퍼링에주의해야합니다. stdout은 터미널에 쓸 때 기본적으로 라인 버퍼링 되지만 파이프에 쓸 때 완전히 버퍼링되는 경우입니다. 따라서 다음 tail
은 명시 적으로 라인 버퍼링 되기 때문에 (또는 각 라인의 끝에서 출력을 플러시하기 때문에) 출력 이 발견되면 바로 라인을 방출 grep
하며 출력이 터미널로 이동하기 때문에 라인 버퍼링됩니다.
tail -F -n0 somefile | grep somepattern
그러나 그런 다음 출력을 처리 awk
하거나 cut
추가 처리 하기로 결정합니다 .
tail -F -n0 somefile | grep somepattern | awk '{print $3}'
이제 로그의 양에 따라 출력이 어디로 갔는지 궁금해 할 수 있습니다. 출력을 얻을 수 있지만 stdout이 grep
완전히 버퍼링 된 방식으로 작동 하기 때문에 한 번에 한 페이지가됩니다. 따라서 awk
한 번에 4kB의 입력을받습니다 (기본적으로).
이 경우 옵션 grep
을 사용하여 항상 stdout 라인을 버퍼링하도록 지시 할 수 있습니다 --line-buffered
.
tail -F -n0 somefile | grep --line-buffered somepattern | ...
그러나 대부분의 명령에는의 아날로그가 없습니다 --line-buffered
. 더 많은 스크립트 가능한 도구의 경우 함수를 사용하여 출력을 플러시 할 수 있습니다 (예 : in awk
은 함수가 fflush()
C와 동일한 이름을 공유하고 Perl 및 Python과 같은 도구는 비슷한 것을가집니다).
cut
당신 과 같은 사람들 은 운이 좋지 않을 것입니다. ...하지만 검색을 시도 할 수 있습니다 unbuffer
. expect
툴 체인에서 제공 한 것으로 생각합니다 (사용한 적이 없습니다).
이 정보가 도움이 되었기를 바랍니다.
건배, 카메론