BEGIN y END con el comando awk

De acuerdo con el manual de awk, BEGIN y END no se utilizan para hacer coincidir la entrada, sino para proporcionar inicio y limpieza -up información al script awk. Aquí está el ejemplo dado:

ls -l | \ awk "BEGIN { print "Files found:\n" } /\<[a|x].*\.conf$/ { print $9 }" Files found: amd.conf antivir.conf xcdroast.conf xinetd.conf 

Primero imprime una cadena para generar. Luego verifica la entrada para una coincidencia de patrón, donde la entrada comienza con a o x seguida de cualquier carácter una o muchas veces seguido de .conf. Para cualquier coincidencia, se imprime la columna novena.

El hecho de que nos veamos obligados a usar begin aquí, ¿significa eso que awk solo puede usar como máximo una función de impresión que contenga BEGIN o END? Si no es así, ¿por qué no podemos usar la función de impresión al principio sin la palabra clave BEGIN? Parece que BEGIN es superfluo.

Comentarios

  • Simplemente ejecutar el comando sin BEGIN respondería su pregunta, mostrando que ' no es superfluo y que obtendría un resultado diferente.

Respuesta

El BEGIN no es «superfluo. Si no «especifica BEGIN entonces print se ejecutará para cada línea de entrada.

Citando de el manual :

Un BEGIN la regla se ejecuta solo una vez, antes de que se lea el primer registro de entrada. Del mismo modo, una regla END se ejecuta solo una vez, después de leer toda la entrada.

$ seq 5 | awk "BEGIN{print "Hello"}/4/{print}" # Hello printed once Hello 4 $ seq 5 | awk "{print "Hello"}/4/{print}" # Hello printed for each line of input Hello Hello Hello Hello 4 Hello $ 

Respuesta

awk procesa cada línea de entrada para las expresiones dadas en el cuerpo que no sea BEGIN y END bloques. En el caso de BEGIN y END bloques, awk procesará las declaraciones solo una vez, antes de que comience el procesamiento de la entrada y después de que se haya realizado el procesamiento de la entrada, resp efectivamente. Sin el bloque BEGIN, no solo no podría imprimir información de una sola vez, como encabezados, sino que tampoco podría inicializar de manera eficiente algunas de las variables requeridas por el cuerpo. Además, para su información, un programa awk puede tener varios bloques BEGIN y END.

Respuesta

awk ejecuta cada bloque solo cuando el patrón anterior coincide. El patrón vacío (solo bloque) coincide con todas las líneas. BEGIN y END son patrones especiales que coinciden con el principio y el final del archivo (análogo al significado de ^ y $ en dirección horizontal).

Si desea ejecutar algo antes de leer el archivo, utilice BEGIN. Por ejemplo, inicialización de contadores o algo así. END podría recopilar los resultados.

Respuesta

En el ejemplo dado, que creo que se simplifica por claridad pedagógica, tienes razón en que es superfluo. Podría obtener los mismos resultados sin utilizar BEGIN.

1 == NR { print "Files found:\n" } /\<[a|x].*\.conf$/ { print $9 } 

produciría los mismos resultados ya que la declaración de impresión es restringido a la primera línea de entrada.

Dicho esto, los bloques BEGIN y END son increíblemente poderosos instrumentos. Como han mencionado otras soluciones, puede usar el bloque BEGIN para inicializar variables u otras rutinas que solo deben realizarse una vez, pero también se puede usar para ejecutar comandos Awk cuando no hay archivos a procesar. Un ejemplo simple:

BEGIN { print sqrt(12/4) } 

Puede ver un ejemplo más serio de programación en Awk sin procesar ninguna entrada aquí .

Del mismo modo, el bloque END es extremadamente útil para realizar cálculos y resumir toda la entrada. Esto no se puede hacer (normalmente) sin leer primero todos los datos. Puede encontrar un ejemplo simple de resumen de entrada aquí

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *