Bash의 단일 작업으로 grep의 출력 및 반환 값을 가져옵니다.

Bash의 단일 작업으로 grep의 출력 및 반환 값을 가져옵니다.

저는 bash 스크립트를 작성 중입니다. 특정 명령과 grep을 실행합니다.

pfiles $1 2> /dev/null | grep name # $1 Process Id

응답은 다음과 유사합니다.

sockname: AF_INET6 ::ffff:10.10.50.28  port: 22
peername: AF_INET6 ::ffff:10.16.6.150  port: 12295

응답은 행 없음, 1행 또는 2행일 수 있습니다.
grep이 줄을 반환하지 않으면(grep 반환 코드 1) 스크립트를 중단합니다. 줄이 1개 있으면 A() 또는 B()를 호출합니다(줄이 1개 이상인 경우). 출력이 1~2줄이면 grep의 반환 코드는 0입니다.

grep에는 반환 값(0 또는 1)과 출력이 있습니다.
어떻게 하면 둘 다 잡을 수 있나요? 내가 다음과 같은 일을 한다면:

OUTPUT=$(pfiles $1 2> /dev/null | grep peername)

그런 다음 OUTPUT 변수는 출력(문자열)을 갖게 됩니다. 또한 grep 실행을 위한 부울 값도 필요합니다.

답변1

당신은 그것을 사용할 수 있습니다

output=$(grep -c 'name' inputfile)

변수에는 output숫자 0또는 1가 포함됩니다 2. 그런 다음 if문을 사용하여 다양한 작업을 수행 할 수 있습니다 .

답변2

이는 매우 간단합니다.

OUTPUT=$(pfiles "$1" 2> /dev/null | grep peername)
grep_return_code=$?

$(…)명령 대체를 변수에 할당 하면 $?에서 복사됩니다 $(…). 물론 $?이를 명시적으로 참조할 필요는 없습니다.

if OUTPUT=$(pfiles "$1" 2> /dev/null | grep 피어 이름)
그 다음에
    #나머지 스크립트
필리핀 제도

또는

만약에!OUTPUT=$(pfiles "$1" 2> /dev/null | grep 피어 이름)
그 다음에
    출구
필리핀 제도
#나머지 스크립트

이 접근 방식은 다음과 같은 상황에서 유용합니다.산출이 명령과 그반환 코드(종료 상태라고도 함)은 관련이 없습니다. 그러나 의 경우 grep상관관계가 높습니다. 즉, 출력이 생성되면 성공합니다. 출력이 생성되지 않으면 실패합니다. 그렇다면 그냥 테스트해 보는 것은 어떨까요?산출 ?

OUTPUT=$(pfiles "$1" 2> /dev/null | grep 피어 이름)
if["$output"]
그 다음에
    #나머지 스크립트
필리핀 제도

또는

OUTPUT=$(pfiles "$1" 2> /dev/null | grep 피어 이름)
만약에 [-지"$출력"]
그 다음에
    출구
필리핀 제도
#나머지 스크립트

"$1"추신: 타당한 이유가 없고 자신이 무엇을 하고 있는지 확실히 알고 있지 않는 한 항상 쉘 변수 참조(예: )를 인용해야 합니다 .

답변3

필요한 결과가 필요한 경우 다른 답변에 설명된 플래그를 grep사용할 수 없습니다 . -c하지만 할 수 있는 일은 두 번 실행하는 것입니다. 한 번은 -c플래그를 사용하여 일치 항목 수를 가져오고, 한 번은 -c플래그 없이 일치 항목을 확인하는 것입니다. 그러나 이는 입력 파일의 크기에 따라 매우 비효율적일 수 있습니다.

다음을 수행할 수 있습니다.

콘텐츠입력하다:

The first line is foo
I have a drink at the bar
The third line is foo again

콘텐츠스크립트:

#!/usr/bin/env bash

countMatches(){
    echo Searching for "${1}"
    result=$(grep "${1}" input)
    if [ "$?" -ne 0 ]; then
        echo No match found
        echo
        exit 1
    fi

    if [ $(echo "${result}" | wc -l) -eq 1 ]; then
        echo 1 match found:
        echo "${result}"
        echo
    else
        echo 2 matches found:
        echo "${result}"
        echo
    fi
}

countMatches foo
countMatches bar
countMatches baz

호출할 때의 출력입니다.스크립트:

Searching for foo
2 matches found:
The first line is foo
The third line is foo again

Searching for bar
1 match found:
I have a drink at the bar

Searching for baz
No match found

답변4

해당 출력을 계속 표시하면서 일부 파이프 출력에 대한 테스트로 grep을 사용하는 방법을 알아내려고 노력하는 동안 이 문제에 직면했습니다. 파일을 greping하는 것이 아니라 stdin을 사용한다는 점에 유의하세요.

내 구체적인 예는 다음과 같습니다.

./manage.py --dry-run makemigrations | grep "No changes detected"

당시 반환 코드는 0(성공)이었습니다 No changes detected. 변경 사항이 있는 경우 반환 코드는 1(실패)입니다. 그러나 grep이 일치하지 않으므로 필요한 변경 사항이 인쇄되지 않습니다.

내 솔루션은 다음과 같습니다

./manage.py --dry-run makemigrations | tee /dev/stderr | grep -q "No changes detected"

그러면 항상 출력이 인쇄되지만 여전히 올바른 오류 코드가 반환됩니다.

관련 정보