grep이 true/false를 반환할 수 있습니까? 아니면 다른 방법이 있습니까?

grep이 true/false를 반환할 수 있습니까? 아니면 다른 방법이 있습니까?

이 스크립트의 일부로 주어진 첫 번째 인수가 파일의 첫 번째 단어와 일치하는지 확인할 수 있어야 합니다. 그렇다면 오류 메시지와 함께 종료하고, 그렇지 않은 경우 매개변수를 파일에 추가합니다. 해당 문장을 작성하는 방법은 이해 하지만 스크립트에서 사용하는 if방법은 이해하지 못합니다 . grep나도 grep이렇게 생겼단 걸 알아

grep ^$1 schemas.txt

나는 이것이 내가 한 것보다 훨씬 쉬울 것이라고 생각합니다.

명령문에 "매개변수가 너무 많습니다"라는 오류가 표시됩니다 if. 공백을 제거한 grep -q다음 이진 연산자에 대해 예상되는 오류가 발생했습니다.

if [ grep -q ^$1 schemas.txt ]
then
        echo "Schema already exists. Please try again"
        exit 1
else
        echo "$@" >> schemas.txt
fi

답변1

grep무언가가 발견된 경우(0)와 아무것도 발견되지 않은 경우(0이 아님) 다른 종료 코드를 반환합니다. if명령문 내에서 0 종료 코드는 "true"로 매핑되고 0이 아닌 종료 코드는 false로 매핑됩니다. 또한 grep에는 -q일치하는 텍스트를 출력하지 않고 종료 상태 코드만 반환하는 매개변수가 있습니다.

따라서 다음과 같이 grep을 사용할 수 있습니다.

if grep -q PATTERN file.txt; then
    echo found
else
    echo not found
fi

간단히 말해서, 이와 같은 작업을 수행하면 이것이 실제로 grep과 같이 실행 중인 명령 if [ -z "$var" ]…이라는 것이 밝혀집니다 . [내 시스템에서는 /usr/bin/[. 동일한 방식으로 작동하여 [true에 대해 0 종료 코드를 반환하고 false에 대해 0이 아닌 종료 코드를 반환합니다. ( 결론을 제외하고 test와 동일 )[]

답변2

또 다른 쉬운 방법은 를 사용하는 것입니다 grep -c.

출력(종료 코드로 반환되지 않음)은 패턴과 일치하는 줄 수이므로 일치하는 항목이 없으면 0이고 일치하는 항목이 있으면 1 이상입니다.

따라서 패턴이 3번 이상 일치하는지 확인하려면 다음을 수행할 수 있습니다.

if [ "$(grep -c "^$1" schemas.txt)" -ge 3 ]; then
  ...

답변3

늦었다는 건 알지만 다음 짧은 버전이 마음에 듭니다.

grep -q ^$1 schemas.txt && echo "Schema already exists. Please try again" || echo "$@" >> schemas.txt

답변4

오래된 게시물이지만 실제로 답변이 제공되지 않았습니다.
예, 패턴이 발견되면 Grep은 0(true)을 반환하고, 패턴을 발견하지 못하면 Grep은 1(false)을 반환합니다. grep은 줄 기반이므로 모든 작업을 수행할 것이라고 생각하는 검색어는 아마도 많은 정크 히트를 가져올 수 있다는 점을 명심하세요. 구문 분석 방법은 여러분에게 맡기겠습니다. $? 종료 상태입니다. 파일에서 읽는 대신 파이프를 사용하는 것이 내 스크립트에 더 적합하기 때문에 선호합니다. 나는 다음을 사용합니다 :

{cat/cut/echo/curl/whatever} | grep -q 모드 에코 $?

위의 값이 0을 반환하면 패턴을 찾은 것이고, 1을 반환하면 패턴을 찾지 못한 것입니다.

이는 프로세스를 모니터링하고 특정 스크립트가 종료된 경우 활성 상태를 유지하거나 완료되면 알림을 보내기 위해 while 루프에 넣기 때문에 유용합니다.

관련 정보