Este es un seguimiento de mi pregunta anterior .
Estoy validando el número de campos en / etc / passwd usando este práctico fragmento de código. En el siguiente ejemplo, los usuarios 'fieldcount1' y 'fieldcount2' tienen el número incorrecto 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 notará, awk saldrá con un estado de retorno de 0. Desde su punto de vista, aquí no hay problemas.
Me gustaría incorporar esta declaración awk en un script de shell. Me gustaría imprimir todas las líneas que son error, y establecer el código de retorno en 1 (error).
Puedo intentar forzar un estado de salida particular, pero luego awk solo imprime una sola línea:
$ awk -F: ' NF!=7 {print ; exit 1}' /etc/passwd
fieldcount1:x:1000:100:fieldcount1:/home/fieldcount1:/bin/bash::::
$ echo $?
1
¿Puedo forzar a awk a salir con un estado de retorno de '1' e imprimir todas las líneas que coincidan?
fuente
; echo $?
después de esta declaración awk. Sin embargo,echo $?
nunca se ejecuta porqueEND {exit err}'
termina el script. ¿Hay alguna manera de establecer el estado de devolución sin salir?exit err
termina awk, no termina el script. ¿Tienesset -e
en ese guión, por casualidad? Si es así, le ha dicho al shell que salga si un comando devuelve un estado distinto de cero; si desea probar el estado, useif awk …; then echo ok; else echo fail; fi
.set -e
configurado. Eso explica el extraño comportamiento que estoy viendo. Gracias por señalar eso.&&
operador de bash , vale la pena tener en cuenta que "0 es verdadero pero falso es 1 en el shell" .Estaba buscando algo similar a grep, donde saldrá 1 si no se encuentra una coincidencia. Aquí está el equivalente con awk:
Ejemplo
fuente
Esto no responde a los requisitos exactos de OP, pero si solo le importa el código de retorno y no necesita imprimir las líneas que coinciden, similar a
grep -q
, entonces puede modificar la respuesta de @geekasaur para salir después de la primera coincidencia, lo que para una gran entrada los archivos ahorrarían tiempo si el error es temprano en el archivo. ¡Ojalá/etc/passwd
no califique para ti!fuente
awk -F: 'NF != 7 {exit 1}'
Hará lo mismo.