awk : 반품 상태를 강요합니까?


18

이것은 이전의 질문에 대한 후속 조치 입니다.

이 편리한 코드 조각을 사용하여 / 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'로 강제 종료하고 일치하는 모든 줄을 인쇄 할 수 있습니까?

답변:


23

상태를 변수로 유지하고 END블록 에서 사용하십시오 .

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

아주 좋아요 그러나 이것을 bash 스크립트에 통합하는 데 문제가 있습니다. 이 awk 문 ; echo $?뒤에 같은 것을 추가 하여이 awk 문의 반환 상태를 캡처하려고 합니다. 그러나 스크립트 echo $?END {exit err}'종료 되므로 실행되지 않습니다 . 종료하지 않고 반품 상태를 설정하는 방법이 있습니까?
Stefan Lasiewski

6
@StefanLasiewski exit err는 awk를 종료하고 스크립트를 종료하지 않습니다. 당신이 있습니까 set -e혹시, 해당 스크립트에? 그렇다면 명령이 0이 아닌 상태를 반환하면 셸이 종료되도록 지시 한 것입니다. 상태를 테스트하려면을 사용하십시오 if awk …; then echo ok; else echo fail; fi.
Gilles 'SO- 악한 중지'

@Giles : 예,이 스크립트는 set -e설정되었습니다. 그것은 내가보고있는 이상한 행동을 설명합니다. 지적 해 주셔서 감사합니다.
Stefan Lasiewski

1
bash의 &&연산자 와 함께 출력을 사용하려는 경우 "0은 true이지만 셸에서 false는 1" 입니다.
Skippy le Grand Gourou

8

일치하는 것을 찾지 못하면 Grep과 비슷한 것을 찾고 있었는데 1을 종료합니다. 다음은 Awk와 동일합니다.

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

0

이는 영업 이익의 정확한 요구 사항에 응답하지 않지만,이 경우 에만 반환 코드에 대해 걱정하고 있지 필요 유사 일치, 그 선 인쇄 grep -q, 첫 번째 경기 후, 당신은 출구에 @geekasaur 답을 수정할 수를 거대한 입력하는 파일에서 오류가 일찍 발생하면 파일이 시간을 절약합니다. 바라건대 /etc/passwd당신을 위해 자격이되지 않습니다!

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

1
awk -F: 'NF != 7 {exit 1}'똑같이 할 것입니다.
Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.