2011-02-03 6 views
2

test.log 파일이 있습니다. 매우 큰 로그 파일. 로깅 수준이 다릅니다. 예를 들어, trace, debug, info, warningerror입니다.다른 grep 명령의 출력에 grep 도움이 필요합니다.

분명히 trace 수준의 메시지는 고속으로 스팸합니다. trace 레벨 로그없이 모든 메시지를보고 싶었습니다.

cat test.log | grep -v "trace" 

좋은 작품 :

그래서 나는이했다.

이제 특정 키워드 keyword1을 기반으로 나머지 메시지를 필터링하고 싶습니다.

cat test.log | grep -v "trace" | grep "keyword1" 

좋은 작품 :

그래서 나는이했다.

이제 계속 같은 출력을 얻으려고합니다. 을 tail -f으로 바꾸는 것이 좋습니다.

tail -f test.log | grep -v "trace" | grep "keyword1" 

그러나 이것은 작동하지 않습니다. 나는 결과물을 얻지 못한다.

내가 뭘 잘못하고 있니? 그리고 내가 원하는 필터링 된 'tail & follow'출력을 얻으려면 어떻게해야합니까?

도움 주셔서 감사합니다.

답변

3

버퍼링 문제가 발생했습니다. 성능상의 이유로 grep은 버퍼에 많은 양의 출력을 유지하고 한 번에 전체 청크를 출력합니다. 즉, 입력에서 행을 읽을 때 grep은 더 많은 행을 읽은 후 (다시 읽음) stdout으로 전송합니다. 나중에 읽는 로그 파일을 처리 할 때 꽤 늦을 수 있습니다. tail -f을 사용하십시오.

많은 grep 변종은 켜기 - 켜기 - 라인 버퍼 모드로 전환합니다.이 모드는 일부 성능 손실과 함께 각 라인을 자체적으로 출력합니다. 예를 들어 GNU grep에는 --line-buffered 옵션이 있습니다.

모든 grep 호출에 해당 옵션 (또는 grep 버전에 해당하는 옵션)을 추가하기 만하면 일치하는 항목이 로그 파일에 추가되는 즉시 일부 출력이 표시됩니다.

+1

'-line-buffered'가 트릭을 수행했습니다. 감사. – bits

0

귀하의 코드가 잘 작동 (즉, 어떤 식 으로든 중요한 경우 BTW, 나는 ... Cygwin에서 사용하고 있습니다), 당신은 단지 버퍼링 지연이 발생하고 있습니다. 그래서 긴 시간 동안 아무 것도 보지 않을 것이고 짧은 텍스트가 계속해서 이어지고 또 다른 기다림이 이어질 것입니다. 진행 상황에 대한 설명은 http://perl.plover.com/FAQs/Buffering.html을 참조하십시오.

0

tail -f은 파일의 "새로운 수신 회선"을 따릅니다. 주기적 출력은 파이프 grep 명령에 도달하지 않습니다 (최소한 tail이 종료 될 때까지).

는 주기적으로 이러한 로그 파일의 변경, 당신은 대신 watch을 사용할 수 있습니다 "따르는":이 로그 파일의 모든 초 (-n 1) 마지막 20 개 행을 업데이트 할 수 있습니다

watch -n 1 -- 'tail -n 20 test.log | grep -v trace | grep keyword1' 

.

+0

그러나 설명에 따르면'tail -n 20 test.log | grep -v trace'도 잘 작동하지 않지만 테일 파이프는 1 grep로 작동합니다. 2 개의 연속 된 greps는 작동하지 않습니다. – bits

+0

@bits 명령 변경은'tail -f'에서'tail -n'까지입니다. 내 예제는 2 개의 체인이 연결된 greps는 물론, 하나와 잘 작동합니다 ... –