명령 출력에 쉘 스크립트의 특정 문자열이 포함되어 있는지 확인


116

셸 스크립트를 작성 중이며 명령 출력에 특정 문자열이 포함되어 있는지 확인하려고합니다. 아마도 grep을 사용해야한다고 생각하지만 어떻게해야할지 모르겠습니다. 아는 사람 있나요?


찾고있는 출력 문자열을 생성 한 후 명령을 계속 실행해야합니까, 아니면 즉시 닫을 수 있습니까? (이 점에서 두 가지 답변의 의미가 다릅니다).
Charles Duffy

답변:


97

grep의 반환 값을 테스트합니다.

./somecommand | grep 'string' &> /dev/null
if [ $? == 0 ]; then
   echo "matched"
fi

관용적으로 다음과 같이 수행됩니다.

if ./somecommand | grep -q 'string'; then
   echo "matched"
fi

그리고 또한:

./somecommand | grep -q 'string' && echo 'matched'

2
이 코드는 모든 POSIX 셸에서 작동하지 않습니다. POSIX 표준 =은 비교 연산자 일 필요 가 없습니다 ==. pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html
Charles Duffy

4
또한, grep 'string' &>/dev/null모두 비 POSIX의 준수와 훨씬 느린 실행 (만약 string초기 긴 출력 스트림에 나타납니다) 이상 grep -q string. [당신이해야 할 경우주의해야 할 점은이 somecommand경우에도 발광 후 실행 계속 string경우 사용하여, grep -q- 표준 입력을 닫고의 첫 번째 인스턴스 후 종료에 의해 string볼 - 비생산적 일 수있다]. (Re : "non-POSIX-compliant" &>는 확장입니다 . POSIX에서 요구하는 리디렉션 지원을 설명하는 pubs.opengroup.org/onlinepubs/009695399/utilities/… 참조 ).
Charles Duffy

그것이 작동하는 이유 / 각 매개 변수가하는 일을 설명하면 구문을 완전히 이해하는 데 도움이 될 것입니다
redfox05

157

테스트 $?는 안티 패턴입니다.

if ./somecommand | grep -q 'string'; then
  echo "matched"
fi

혹시 당신은 단지 고정 된 문자열을 테스트 할 경우, 추가 FX 옵션 : grep -Fxq F는 고정 (해석되지 않음)의 약자 X 전체 라인
Erdal은 G.

4
$?안티 패턴 테스트 입니까?
Vitaly Zdanevich

1
@VitalyZdanevich 동시성에 대해 강력하지 않기 때문에 가정합니다.
Konrad Reiche

@VitalyZdanevich, 예를 들어, 테스트 $?는 이전 명령을 트랩 set -e또는 ERR트랩의 목적으로 "확인 됨"으로 설정하지 않으므로 나중에 의도적으로 잘못된 경로로 되돌아 가기를 원하는 경우 프로그램을 종료 할 수 있습니다. 또 다른 $?이유는 불안정한 글로벌 상태입니다. 우연히 그 가치를 버리기 쉽습니다. 예를 들어,와 같은 로깅 행을 추가하면 echo "Exit status is $?"의 새 값 $?이의 종료 상태가 echo됩니다.
Charles Duffy

6

또 다른 옵션은 명령 출력에서 ​​정규식 일치를 확인하는 것입니다.

예를 들면 :

[[ "$(./somecommand)" =~ "sub string" ]] && echo "Output includes 'sub string'"

1

깨끗한 if / else 조건부 쉘 스크립트 :

if ./somecommand | grep -q 'some_string'; then
  echo "exists"
else
  echo "doesn't exist"
fi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.