테일의 출력을 필터링 할 수 있습니까?


11

파일을 꼬리에 붙이고 싶지만 파일에 특정 문자열이있는 출력 줄 만 있습니다. 이게 가능해?

답변:


32

grep을 사용하십시오. 그것은 그 목적을 위해 만들어졌습니다.

/ var / log / syslog의 꼬리에서 "cron"이있는 행을 찾으려면 다음을 실행하십시오.

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

그리고 stdin 이상의 것을 허용하므로, 위와 같은 방식으로 배관하여 (| 기호 사용) 다른 명령의 출력에서도 사용할 수 있습니다.


8
이것이 본질적으로 옳지 만 grep더 긴 파이프 라인의 일부와 같이 비 대화식으로 사용될 때 버퍼링 한다는 것을 인식하는 것이 중요합니다 . GNU grep 2.5.1은 --line-buffered파이프 라인에서 grep을 제거하는 것이 옵션이 아닌 경우이 문제를 해결할 수 있는 옵션을 제공합니다 . grep이 버퍼를 말할 때 버퍼가 4k와 같은 수준에 도달 할 때까지 출력이 표시되지 않음을 의미합니다.
kojiro

이전 주석을 보완하기 위해 최신 Linux에서 "tail -f"는 syslog 파일에서 더 많은 입력을 기다리는 루프에서 작동합니다. 명령이 실제로 파일의 기존 내용으로 완료되게하려면 -f 스위치를 생략하십시오. tail / var / log / syslog | grep cron
그누 디프

7
tail -f /var/log/messages | grep "myfilterword"

희망이 도움이됩니다.


4

간단하지는 않지만 흥미로운 추가 유연성을 제공 할 수있는 몇 가지 다른 아이디어가 있습니다.

먼저 grep 대신 awk로 필터링 할 수 있습니다.

tail -f /var/log/messages | awk '/myfilterword/'

사용하는 예제와 정확히 동일하게 작동합니다 grep. awk의 힘을 사용하여이를 확장 할 수 있습니다. 예를 들면 다음과 같습니다.

tail -f /var/log/messages | \
awk '/myfilterword/ { for (i=6; i<=NF; i++) printf("%s ", $i); printf("\n")}'

출력의 마지막 필드부터 6 번째 필드까지 인쇄됩니다 (필드는 공백으로 구분됨)

또 다른 유사한 아이디어는 perl one-liner를 사용하는 것입니다.

tail -f /var/log/messages | perl -ne "/myfilterword/ and print"

정확히 똑같이 작동합니다 grep. 행 번호 카운터와 6 번째 필드 만 원하십니까? 이것은 어떤가요:

tail -f /var/log/messages | \ 
perl -lane "/myfilterword/ and printf \"%6d %s\n\",++\$a,\$F[6]"

분명히 이러한 모든 종류의 작업은 다른 도구로도 수행 할 수 있지만 여기에 awk 또는 perl과 같은 일반적인 언어를 사용하는 재미있는 방법이 있음을 설명하고 싶었습니다.


grep보다 더 확장하는 방법에 대한 1 개의 정교함!
pablo

2

생략 할 헤더가 포함 된 CSV 파일이있는 경우 다음과 같이주의해야합니다.

% cat data.txt
fruit        dessert        calories
Apple        Pie            770
Banana       Pudding        625
Cherry       Cobbler        990
% tail -n +2 data.txt
Apple        Pie            770
Banana       Pudding        625
Cherry       Cobbler        990

에 시간을 입력 중요하지 않습니다 tail이다, (가) +n -2첫 번째 행을 생략합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.