awk: 강제 반환 상태인가요?

awk: 강제 반환 상태인가요?

이건 내 후속작이야이전 질문.

나는 /etc/passwd의 필드 수를 확인하기 위해 이 편리한 코드 조각을 사용하고 있습니다. 다음 예에서는 사용자 "fieldcount1" 및 "fieldcount2"의 필드 수가 잘못되었습니다.

$ awk -F: ' NF!=7 {print}' /etc/passwd
fieldcount1:x:1000:100:fieldcount1:/home/fieldcount1:/bin/bash::::
fieldcount2:blah::blah:1002:100:fieldcount2:/home/fieldcount2:/bin/bash:
$ echo $?
0

awk가 상태 0으로 종료되는 것을 볼 수 있습니다. 그 관점에서 보면 여기에는 문제가 없습니다.

나는 이 awk 문을 쉘 스크립트에 통합하고 싶습니다. 모든 오류 줄을 인쇄하고 반환 코드를 1(오류)로 설정하고 싶습니다.

특정 종료 상태를 강제로 적용하려고 시도할 수 있지만 awk는 한 줄만 인쇄합니다.

$ awk -F: ' NF!=7 {print ; exit 1}' /etc/passwd
fieldcount1:x:1000:100:fieldcount1:/home/fieldcount1:/bin/bash::::
$ echo $?
1

awk를 상태 "1"로 강제 종료하고 일치하는 모든 행을 인쇄할 수 있나요?

답변1

상태를 변수에 저장하고 END블록에서 사용합니다.

awk -F: 'NF != 7 {print; err = 1}
         END {exit err}' /etc/passwd

답변2

나는 일치하는 항목이 없으면 1로 종료되는 Grep과 유사한 것을 찾고 있었습니다. 이것은 Awk와 동일합니다.

#!/usr/bin/awk -f
BEGIN {
   b1 = 1
}
index($0, "sunday") > 0 {
   b1 = 0
   print
}
END {
   exit b1
}

답변3

이것은 OP의 정확한 요청에 응답하지 않지만, 만약 당신이오직반환 코드에 관심을 갖고아니요이와 같은 일치하는 줄을 인쇄해야 하는 경우 grep -q첫 번째 일치 후 종료되도록 @geekasaur의 답변을 수정할 수 있습니다. 대규모 입력 파일의 경우 파일 초기에 오류가 발생하면 시간이 절약됩니다. /etc/passwd자격을 갖추지 않기를 바랍니다 !

awk -F: 'NF != 7 {err = 1; exit;}
     END {exit err}' /etc/passwd

관련 정보