다음과 같은 경우 종료 코드 1을 반환하려면 awk가 필요합니다.
- grep에서 awk로의 입력이 제공되지 않습니다.
- 두 번째 필드가 비어 있거나 존재하지 않습니다.
grep이 "SOME_PHRASE"를 찾으면 작동하지만 해당 문구가 없으면 반환 코드($?)는 0입니다.
grep -m1 -i '^SOME_PHRASE' test.txt | awk '{ if (length($val)==0 || $val=="" || length($2)==0) exit 1; else print $2; }'
test.txt의 예
Test1 1234
Phrase 214324
예상 출력:
$ echo $?
1
답변1
실제로 다음을 결합할 수 awk
있습니다 grep
.
awk 'BEGIN{rv=1} # Default return value is 1
tolower($0) ~ /^some_phrase/{ # Case insensitive search
if($2 != ""){ # If $2 is not empty,
print $2 # print the value,
rv=0 # and set the return value
}
exit # one match, do not process any more line
}
END{exit rv}
' test.txt
답변2
내가 원하는 것을 달성하는 데 성공했습니다.
grep -m1 -i 'SOME_PHRASE' test.txt | awk 'END { if (NR==0 || $2=="") exit 1; else print $2;}'
답변3
더 직접적으로:
$ awk 'toupper($1) ~ /^SOME_PHRASE/ { if ($2) { print $2; exit 0 } else { exit 1 } } END { exit 1 }' test.txt
첫 번째 필드는 대문자로 변경되고 대문자 패턴과 비교됩니다. 일치하는 항목이 있고 두 번째 필드가 있으면 해당 필드가 인쇄되고 스크립트는 종료 상태 0으로 종료됩니다. 그렇지 않으면(두 번째 필드가 없으면) 종료 상태 1로 종료됩니다. 패턴이 일치하지 않는 경우 스크립트는 입력 끝에 도달하면 종료 상태 1로 종료됩니다.
답변4
간단하게 유지하려면 모든 것을 하나의 지붕/도구 내부로 이동하는 것을 고려해야 합니다.
grep -qE '^SOME_PHRASE.*[^[:space:]]' yourfile
perl -0777ne 'exit !/^SOME_PHRASE.*?\S/m' yourfile
sed -ne '/^SOME_PHRASE.*[^[:space:]]/q;$q1' yourfile
산출
표시된 데이터의 경우 위 명령 중 하나를 실행한 직후 다음을 실행합니다.
echo "$?"
1
간단히
Perl
slurps
multiline
전체 파일은 수정자를 사용하여 //m
문자열에 대해 활성화된 줄 시작 부분에서 키워드를 찾습니다 . 이는 in & world가 상호보완적이라는 사실을 설명하기 위한 것입니다 !
.SUCCESS
Perl
Unix
Sed
don't print unless asked for
모드에서 실행되며 해당 명령에도 종료 상태가 포함되어 있다고 -n
가정합니다 .GNU sed
q