tail -f에서 특정 키워드가있는 항목을 어떻게 필터링합니까?


답변:


58

grep 대신 awk를 사용하는 방법을 모르지만 이것은 나를 위해 작동합니다

tail -f file.log | grep -Ev '(ELB|Pingdom|Health)'

편집 : 로 dmourati 와 갈렙이 지적, 당신은 또한 사용할 수있는 egrep대신의 grep -E편의를 위해. 일부 시스템에서 이것은 동일한 바이너리에 대한 링크이며, 다른 시스템에서는 grep 패키지에서 제공 한 사본입니다. 어느 쪽이든 -E스위치 대신 사용할 수 있습니다. 그러나 GNU grep 매뉴얼 페이지에 따르면 :

[...]이 개 변형 프로그램 egrep및 fgrep사용할 수 있습니다. egrep와 동일합니다 grep -E. fgrep와 동일합니다 grep -F. 직접 호출 egrep또는 fgrep더 이상 사용되지 않지만이를 사용하는 히스토리 애플리케이션이 수정되지 않은 상태로 실행될 수 있도록 제공됩니다.

그것들은 동의어 명령이기 때문에 egrep이 전혀 없다면 기본 설정으로 내려갑니다. 그러나 앞으로 호환성을 위해 grep -E다른 방법은 공식적으로 사용되지 않으므로 구문 을 사용하는 것이 좋습니다 .


grep -E대신에 사용 egrep하면 중복 답변이 필요합니까?
— Caleb

@ Caleb 나는 왜 안보이는 지 모르겠다. 고양이를 껍질을 벗기는 방법은 여러 가지가
— 있으며이

1
그렇습니다.하지만 기능적으로 겹치는 두 개의 서로 다른 프로그램이 아니라 서로에 대한 심볼릭 링크 일뿐입니다. 그래서 그것은 완전한 답변이 아닌 '부록'(읽기 : 주석)에 더 가깝지 않습니까? 나는 더 적은 범죄에 대한 공감대를 가졌습니다 ...
— Marcin

@ DTest : 권리에 의해 dmourati는 실제로 몇 초 만에 펀치를 때렸습니다. 그가 추론을 설명하지는 않았지만 여기에서 약간의 크레딧을받을 가치가 있습니다. 우리 둘 다 들어 오기 전에 적어도 두 개의 공감대가 있었기 때문에 당신은 분명히 파티에 늦었다. 다르게 피부에 고양이를 원하는 사용하는 경우 sed, awk, perl, multitail또는 ninja_foo.
— Caleb

1
@ DTest : 나는 원래 소스를 추가하기 위해 귀하의 답변을 크게 수정하는 자유를 얻었습니다. 향후 사용에는 -E가 권장되는 것처럼 보이므로이를 표시했지만 egrep이없는 배포판에 대한 메모는 제거했습니다. 언급 된 배포자는 egrep을 가지고 있으며 심볼릭 링크 대신 별도의 바이너리 일뿐입니다.
— Caleb

21

필터링하려는 파이프로 구분 된 단어 목록을 사용하여 파이프를 연결하십시오.

tail -f log_file | egrep -v 'ELB|Pingdom|Health'

일치 목록 주위에 괄호를 사용하는 것은 선택 사항입니다. 이 때문에 |그렙 의해 논리 OR 연산자로 처리되어 그 서브 그룹의 여부의 일환으로 수행 할 것인지. '(ELB|Pingdom|Health)'정확히 동일하게 작동합니다. 어떤 경우에는 구문이 더 분명 할 수 있습니다. 괄호를 추가하지 않고 단일 일치 항목에서 가능한 일치 목록으로 전환 할 수 있으므로 입력하기가 더 쉽습니다.

추가적인 크레딧을 얻으 multitail려면 출력을 필터링 할 때 ninja foo를 수행하는 것이 좋습니다. 예를 들어 다음과 같이 단어를 필터링 할 수 있습니다.

multitail -e ELB -e Pingdom -e Health -f log_file

출력을 필터링하지 않고 색상을 지정하거나 강조 표시하는 데 사용할 수도 있습니다.

EDit : egrep이 더 이상 사용되지 않는 대체 방법 인 DTests 답변 과 설명을 참조하십시오 grep -E.


2
표현은 ( ")가 아닌 ( ')로
— 끝나서는 안

네, 오타였습니다. 스택 교환 사이트가 위키와 같은 기능을하므로 향후 참조를 위해 수정해야 할 종류입니다.
— Caleb

편집 내용이 6 자 이상이어야한다고 생각 했습니까?
— Sirex

높은 담당자가 없으면 예는 6 자 이상이지만이 경우 1자가 매우 중요합니다. 본문에 HTML 주석을 추가하여 변경을 강제 실행할 수 있습니다. 문자는 한도에 포함되며 변경하는 이유를 알 수 있습니다.
— Caleb

감사 @Caleb 너무 많은 multitail 제안을 그 것이다 최고 ! 내가 없이는 내 인생에서 오랫동안 갔다고 믿을 수 없어.
— sidewinderguy


3

이 정보를 왜 기록 하시겠습니까?

  • 보관 용으로 엄격합니까?
  • 로그 파일의 다른 키워드 또는 패턴에 따라 다른 스크립트를 조건부로 실행 하시겠습니까?

로그 파일의 내용에 따라 스크립트 동작을 수행하려면 Expect를 사용하여 필터링을 수행 할 수 있습니다. ( http://en.wikipedia.org/wiki/Expect ) Expect는 Tcl 확장이지만 Python 버전의 Expect도 있습니다.

Expect는 입력 스트림에 존재하는 상태 또는 패턴에 따라 조건에 따라 다른 동작을 지정할 수있는 이처럼 유연한 유연한 스위치 식 설명을 제공합니다. 예를 들면 다음과 같습니다.

expect {  
    "password:" {  
        send "password\r"  
    } 
    "yes/no)?" {  
        send "yes\r"  
        set timeout -1  
    }  
    timeout {  
        exit  
    }   
    -re . {  
        exp_continue  
    }  
    eof {  
        exit  
    }  
}

따라서 expect 문에서 패턴을 지정하고 다른 동작을 지정하고 모든 것을 루프로 감싸고 입력의 일부를 다른 파일에 쓰거나 완전히 삭제하는 매우 강력한 필터를 쉽게 작성할 수 있습니다. 입력 내용에 따라 조치를 취하고 다른 스크립트를 실행하십시오.

따라서 로그 파일을 필터링하거나 로그 입력에 대해 조치를 취하거나 보관상의 이유로 왜 로그 파일을 필터링하려고합니까?


내가 오래 전에 사용하고 완전히 잊어 버린 Expect에 대한 참조를위한 하나입니다.
— MPi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.