실시간 로그(stdout)를 어떻게 grep합니까?

실시간 로그(stdout)를 어떻게 grep합니까?

이것이 표준 출력인지는 확실하지 않지만 제 생각에는 그렇습니다.

내가 원하는 것은 실행 파일을 실행할 때 특정 로그 메시지를 필터링하는 것입니다.

나는 이것을 시도했습니다 :

Executable 2>&1 /dev/null | grep -v "fixme:quartz:Parser_OutputPin_QueryInterface No interface for {56a868a5-0ad4-11ce-b03a-0020af0ba770}!"

정상적인 것도 있습니다:

Executable | grep -v "fixme:quartz:Parser_OutputPin_QueryInterface No interface for {56a868a5-0ad4-11ce-b03a-0020af0ba770}!"

하지만 터미널은 여전히 ​​수천 개의 fixme:quartz다른 메시지로 가득 차 있습니다.

답변1

먼저 원하는 메시지가 stdout으로 전송되는지 stderr로 전송되는지 확인해야 합니다. 첫 번째 예에서는 stderr를 stdout으로 리디렉션했습니다. 이것이 "2>&1" 부분입니다. 명령줄에 "/dev/null"도 있는데 이는 전혀 의미가 없습니다. 명령줄에 "/dev/null"이 나타나는 이유는 무엇입니까?

둘째, 어떤 메시지를 보고 싶은지 결정해야 합니다. "-v" 플래그는 다음 grep과 같습니다.상하 반전일치 - 패턴 문자열과 일치하지 않는 줄만 인쇄됩니다. 지정한 패턴은 매우 정확합니다. 예를 들어 'fixme:quartz'길이가 짧을수록 grep -v더 많은 행을 일치시키지 못하는 패턴을 덜 구체적인 패턴으로 시도할 수 있습니다.

내가 당신이라면 다음과 같이 할 것입니다.

Executable > log 2> err

이는 stdout과 stderr을 두 개의 다른 파일로 분리합니다. "fixme:quartz"라는 문자열을 찾으려면 다음과 같이 하세요.

grep 'fixme:quartz' log
grep 'fixme:quartz' err

어떤 파일을 보고 싶은지 결정한 다음 정규식(예: vim)을 지원하는 텍스트 편집기를 사용하여 원하는 것을 찾으세요.

이것이 작동하지 않거나 Executable오랜 시간 동안 실행해야 하고 특정 메시지만 보고 싶다면 위 절차를 수행하고 vim메시지가 stdout 또는 stderr에 있는지 확인하는 정규식을 사용하십시오. 그러면 다음과 같이 할 수 있습니다:

Executable > log 2> err
tail -f log | grep 'fixme:quartz'  # or whatever regular expression

Executable메시지를 실행하고 생성할 때 tail -f메시지는 "로그" 파일에서 주기적으로 읽혀지고 자체 표준 출력으로 인쇄되며, 여기에서 grep필터링됩니다.

관련 정보