grep 종료 코드를 얻지만 모든 줄을 인쇄하는 방법은 무엇입니까?

grep 종료 코드를 얻지만 모든 줄을 인쇄하는 방법은 무엇입니까?

명령으로 인쇄된 줄에 오류 메시지가 포함되어 있는지 확인하고 싶고 (로깅을 위해) 명령의 모든 출력도 인쇄하고 싶습니다 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'

이것은 다소 신비스럽기 때문에 어떻게 작동하는지 설명하려고 합니다.

  • 기본적으로 sedstdin에서 stdout까지 모든 줄이 인쇄되므로 모든 줄을 인쇄하려는 첫 번째 목표를 달성했습니다.
  • /^Error/,$/^Error/그런 다음 패턴과 일치하는 줄부터 파일 끝까지( $마지막 줄을 의미)까지의 범위를 정의합니다.
  • 이 범위 내에서 명령이 실행됩니다 b. b레이블로 분기(즉, 점프)합니다. 태그를 생략하면 스크립트 끝으로 분기됩니다. sed반환 상태 코드는 0입니다.
  • 패턴과 일치하는 행이 없으면 /^Errorrange 명령이 실행되지 않으므로 스크립트 끝으로 이동하지 않습니다. 대신 다음 명령을 실행하십시오: $q1.
  • $q1q1마지막 줄( )에서 명령을 실행한다는 의미입니다 $. q1상태 코드로 스크립트 종료1

관련 정보