저는 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"
그러면 항상 출력이 인쇄되지만 여전히 올바른 오류 코드가 반환됩니다.