Este é um seguimento da minha pergunta anterior .
Estou validando o número de campos em / etc / passwd usando este snippit útil. No exemplo a seguir, os usuários 'fieldcount1' e 'fieldcount2' 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 igual a 0. Do ponto de vista dele, não há problemas aqui.
Gostaria de incorporar essa declaração do awk em um script de shell. Gostaria de imprimir todas as linhas com erro e definir o código de retorno como 1 (erro).
Posso tentar forçar um status de saída específico, mas o awk apenas 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 o status de retorno '1' e imprimir todas as linhas correspondentes?
text-processing
shell-script
awk
Stefan Lasiewski
fonte
fonte
; echo $?
depois dessa declaração do awk. No entanto,echo $?
nunca é executado porqueEND {exit err}'
finaliza o script. Existe uma maneira de definir o status de retorno sem sair?exit err
finaliza o awk, não finaliza o script. Você temset -e
nesse roteiro, por acaso? Nesse caso, você disse ao shell para sair se um comando retornar um status diferente de zero; se você quiser testar o status, useif awk …; then echo ok; else echo fail; fi
.set -e
definido. Isso explica o comportamento estranho que estou vendo. Obrigado por apontar isso.&&
operador do bash , vale lembrar que "0 é verdadeiro, mas falso é 1 no shell" .Eu estava procurando por algo semelhante ao grep, onde sairá 1 se uma correspondência não for encontrada. Aqui está o equivalente ao awk:
Exemplo
fonte
Isso não responde aos requisitos exatos do OP, mas se você se preocupa apenas com o código de retorno e não precisa imprimir as linhas correspondentes,
grep -q
é possível modificar a resposta do @geekasaur para sair após a primeira correspondência, o que gera uma entrada enorme arquivos economizariam tempo se o erro ocorresse no início do arquivo. Espero/etc/passwd
que não se qualifique para você!fonte
awk -F: 'NF != 7 {exit 1}'
fará o mesmo.