이것이 표준 출력인지는 확실하지 않지만 제 생각에는 그렇습니다.
내가 원하는 것은 실행 파일을 실행할 때 특정 로그 메시지를 필터링하는 것입니다.
나는 이것을 시도했습니다 :
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
필터링됩니다.