[server] `tail -f`의 실시간 출력에 필터를 적용하는 방법?

tail -f path

위의 내용은 파일 수정 사항을 즉시 출력하지만 출력에 필터를 적용하고 키워드가있을 때만 표시 xxx하려고합니다.

이것에 접근하는 방법?



답변

유닉스를 사용하면 한 프로그램의 출력을 다른 프로그램으로 파이프 할 수 있습니다.

따라서 꼬리를 필터링하려면 grep을 사용할 수 있습니다.

tail -f path | grep your-search-filter


답변

짧은 답변: tail -f somefile | grep somepattern

그러나 이것은 부족한 경향이 있습니다. 자주 회전하는 파일을 마무리한다고 가정합니다 (디버그 로그인 경우 여러 번 회전 될 수 있음). 이 경우 tail -F친구입니다. 차이점을 찾아 보도록하겠습니다.

그러나 tail -ftail -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툴 체인에서 제공 한 것으로 생각합니다 (사용한 적이 없습니다).

이 정보가 도움이 되었기를 바랍니다.

건배, 카메론


답변

여러 개의 파이프와 그렙을 사용할 수 있고 grep -v로 항목을 제외하고 grep -i로 대소 문자를 구분할 수 없습니다.

즉 : tail -100f / var / log / messages | grep -V ACPI | grep -i ata

끝에서 100 줄을 테일링하고 테일링을 유지하고, 먼저 ACPI를 사용하여 행을 제외하고 ata, ATA 또는 이들을 혼합 한 행을 표시하십시오.

또 다른 편리한 방법은 After, Before 및 Context 행 (이전 및 이후 행)에 대한 ABC 옵션입니다.


답변