명령으로 인쇄된 줄에 오류 메시지가 포함되어 있는지 확인하고 싶고 (로깅을 위해) 명령의 모든 출력도 인쇄하고 싶습니다 make
. 얻을 수 있는 방법이 있나요?모두명령의 출력(수정되지 않음)과 해당 출력을 기반으로 하는 종료 코드는 무엇입니까? 내가 생각할 수 있는 가장 가까운 해결책은 my_command | grep -C 99999999 '^Error'
.
이는 비슷하면서도 다르다.이 문제, 종료 코드에 관심이 있고 색상을 지정하고 싶지 않기 때문입니다.
답변1
그것을 사용 tee
하고 stderr로 리디렉션하십시오.
my_command | tee /dev/stderr | grep -q '^Error'
종료 상태를 저장 grep
하고 모든 출력을 콘솔에 표시되는 stderr에 복사합니다. 표준 출력에 필요한 경우 나중에 다음과 같이 리디렉션할 수 있습니다.
( my_command | tee /dev/stderr | grep -q '^Error' ) 2>&1
아무것도 출력되지 않지만 grep
열립니다 tee
.
답변2
AWK를 사용하여 이 작업을 수행할 수 있습니다.
command 2>&1 | awk '/^Error/{exit_code=1;}/^/ END{ exit !exit_code}'
그러면 모든 출력 라인이 인쇄되며, 발견되면 0을 반환 Error
하고 그렇지 않으면 1을 반환합니다.
답변3
당신은 이것을 할 수 있습니다sed게다가!
+를 모두 인쇄하는 기능입니다.강조하다일치+종료 코드 반환(5) 일치하는 항목이 없는 경우:
search_regex()
{
pattern=$1
shift
esc=$(printf "\033")
sed '/'"${pattern}"'/,${s//'$esc'[32m&'$esc'[0m/g;b};$q5' "$@"
}
$ echo -e "무슨 문제\n존스 씨?" |
무엇인가요위로
J 씨존재하다응?
답변4
방법은 다음과 같습니다sed색칠을 원하지 않는 경우, 즉 정확한 출력을 원하는 경우:
my_command | sed '/^Error/,$b;$q1'
이것은 다소 신비스럽기 때문에 어떻게 작동하는지 설명하려고 합니다.
- 기본적으로
sed
stdin에서 stdout까지 모든 줄이 인쇄되므로 모든 줄을 인쇄하려는 첫 번째 목표를 달성했습니다. /^Error/,$
/^Error/
그런 다음 패턴과 일치하는 줄부터 파일 끝까지($
마지막 줄을 의미)까지의 범위를 정의합니다.- 이 범위 내에서 명령이 실행됩니다
b
.b
레이블로 분기(즉, 점프)합니다. 태그를 생략하면 스크립트 끝으로 분기됩니다.sed
반환 상태 코드는 0입니다. - 패턴과 일치하는 행이 없으면
/^Error
range 명령이 실행되지 않으므로 스크립트 끝으로 이동하지 않습니다. 대신 다음 명령을 실행하십시오:$q1
. $q1
q1
마지막 줄( )에서 명령을 실행한다는 의미입니다$
.q1
상태 코드로 스크립트 종료1