meaning - ¿Por qué "1" en awk imprime la línea actual?
awk unix (3)
En esta respuesta ,
awk ''$2=="no"{$3="N/A"}1'' file
Fue aceptado. Tenga en cuenta el 1
al final de la secuencia de comandos AWK. En los comentarios, el autor de la respuesta dijo:
[1 es] una forma críptica de mostrar la línea actual.
Estoy confundido. ¿Cómo funciona?
AWK trabaja en el método de la condición y luego la acción. Entonces, si alguna condición es VERDADERA, entonces se ejecutará cualquier acción que mencionemos que suceda.
En el caso de 1
significa que estamos haciendo que esa condición sea VERDADERA y, en este caso, no mencionamos ninguna acción que suceda, por lo que la print
acción por defecto de awk sucederá.
Así que por eso escribimos 1 en atajo realmente hablando.
En awk
,
Como 1
siempre se evalúa como verdadero , realiza la operación predeterminada {print $0}
, por lo tanto, imprime la línea actual almacenada en $0
Entonces, el awk ''$2=="no"{$3="N/A"}1'' file
es equivalente a y una abreviatura de
awk ''$2=="no"{$3="N/A"} {print $0}'' file
Nuevamente, $0
es el argumento predeterminado para imprimir , por lo que también podría escribir
awk ''$2=="no"{$3="N/A"} {print}'' file
De hecho, también puede usar cualquier número que no sea cero o cualquier condición que siempre se evalúe como verdadera en lugar de 1
La documentación says
En una regla awk, se puede omitir el patrón o la acción, pero no ambos. Si se omite el patrón, entonces la acción se realiza para cada línea de entrada. Si se omite la acción, la acción predeterminada es imprimir todas las líneas que coincidan con el patrón.
Entonces, trata al 1
como patrón sin acción. La acción por defecto es imprimir la línea.
Incluso si tienes un par de reglas, como en
awk ''
in_net {
if (/^/s+bindIp:/) {
print " bindIp: 0.0.0.0"
next
} else if (/^/s*(#.*)?$/) {
in_net = 0
}
}
/^net:/ {
in_net = 1
}
1
'' /etc/mongod.conf
Aún necesita 1
, ya que la acción predeterminada solo se activa cuando se encuentra una regla sin acción.