awk: forçando um status de retorno?

10

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?

    
por Stefan Lasiewski 13.07.2011 / 02:30

2 respostas

20

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
    
por 13.07.2011 / 02:33
3

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

Exemplo

    
por 21.05.2015 / 06:37