Mantenha o status em uma variável e use-o em um bloco END
.
awk -F: 'NF != 7 {print; err = 1}
END {exit err}' /etc/passwd
Este é um acompanhamento do meu pergunta anterior .
Eu estou validando o número de campos em / etc / passwd usando este snippit útil. No exemplo a seguir, os "fieldcount1" e "fieldcount2" dos usuários têm o número errado de campos:
$ 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
Como você notará, o awk sairá com um status de retorno de 0. Do ponto de vista dele, não há problemas aqui.
Eu gostaria de incorporar essa instrução awk em um script de shell. Gostaria de imprimir todas as linhas que são erro e defina o código de retorno como 1 (erro).
Eu posso tentar forçar um status de saída específico, mas o awk só imprime uma única linha:
$ awk -F: ' NF!=7 {print ; exit 1}' /etc/passwd
fieldcount1:x:1000:100:fieldcount1:/home/fieldcount1:/bin/bash::::
$ echo $?
1
Posso forçar o awk a sair com um status de retorno de '1' e imprimir todas as linhas correspondentes?
Eu estava procurando por algo semelhante ao grep, onde ele sairá do 1 se um jogo for não encontrado. Aqui está o equivalente ao awk:
awk '
BEGIN {z=1}
/bravo/ {z=0; print}
END {exit z}
' alpha.txt