Primeros pasos con el comando Awk

Primeros pasos con el comando Awk

Awk es un poderoso lenguaje de programación de procesamiento de datos integrado en casi todos los sistemas * nix. Parece un lenguaje de programación de propósito general en la superficie, pero está diseñado para recibir información y ejecutar acciones basadas en esa información. Si necesita procesar texto en función de ciertas condiciones, awk casi siempre hará el trabajo más rápido que un lenguaje de propósito general como C. También se interpreta, por lo que evita el largo proceso de compilación y depuración de los lenguajes compilados.

Dato extra divertido: el extraño nombre del programa es una inicial de los nombres de sus programadores: Alfred Ahola, pedro WEinberger y Brian kernihan

Sintaxis básica de Awk

Cuando se invoca en la línea de comandos, awk sigue el siguiente patrón básico:

pattern { action } file
pattern { action } file
...

Awk ejecutará la acción siempre que el patrón coincida con el archivo especificado. Si no especifica un archivo, awk se ejecutará en la salida estándar. Al hacer coincidir patrones, awk puede tomar expresiones regulares así como entradas programáticas. Consideremos este ejemplo básico a continuación:

awk '/com/ { print $0 }' emails

awk-command-primeros pasos-1

Este programa de una línea imprimirá cada línea del archivo «correos electrónicos» que contienen los caracteres com. en awk $0 se refiere a la línea actual, que también es el comportamiento predeterminado. La línea podría haber sido escrita sin $0, y habría funcionado de forma idéntica.

Campos de impresión

Debido a que awk puede identificar y analizar separadores de campos, es útil para imprimir columnas o filas de datos específicas. Usaremos el archivo “/etc/passwd” para este ejemplo.

awk -F":" '{ print $1 }' /etc/passwd

awk-command-primeros pasos-2

Este programa de una línea hace algunas cosas. La bandera -F indica que el carácter siguiente (: en este ejemplo) debe interpretarse como el separador de campo. Awk les imprime el primer campo, especificado por $1.

También podemos imprimir más de un campo a la vez especificando los campos secuencialmente:

awk -F":" '{ print $4 " " $5}' /etc/passw

Producirá una salida similar a la siguiente.

awk-command-primeros pasos-4

Esto imprime los campos cuarto y quinto del passwd archivo con un espacio entre ellos. Tenga en cuenta que el espacio está entre comillas dobles. Esto lo especifica como un carácter literal dentro del comando de impresión, por lo que se imprime tal como está escrito. También podemos agregar literales más complicados para limpiar nuestra salida:

awk -F":" '{ print "process: " $5 "\t\t " "directory: "$6}' /etc/passwd

awk-command-primeros pasos-5

Esto imprimirá la salida con etiquetas para su identificación. Y podemos enviar todo esto a un nuevo archivo usando un signo de intercalación (>).

awk -F":" '{ print "process: " $5 "\t\t " "directory: "$6}' /etc/passwd > processes.txt

Podemos combinar lo que sabemos hasta ahora para procesar datos de forma extensiva. Por ejemplo, podemos usar expresiones regulares para imprimir todas las líneas de un documento que contiene un número de teléfono válido de EE. UU.

awk '/^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4}$/ { print }' contacts

Expandiendo el poder de coincidencia del comando Awk

Awk también puede procesar información usando una variedad de operandos. Esto incluye operandos estándar como ==, <, >, <=, >=y !=así como operandos específicos de awk ~ y !~, que significan «coincide» y «no coincide» respectivamente. Estos operandos se utilizan al comparar expresiones regulares con lógica booleana, así como frases programáticas más estándar.

Ejemplos de comandos Awk

awk 'length($0) > 80' data

Imprime todas las líneas de más de ochenta caracteres en el archivo «datos». Tenga en cuenta la falta de una declaración de impresión: en ausencia de una acción específica, awk imprimirá la línea completa cada vez que coincida un patrón.

Imprime todas las líneas donde el primer campo es igual a la cadena «usuario». sin un -F flag, awk utilizará espacios en blanco como separador de campo predeterminado. Además, tenga en cuenta que awk y el archivo no están especificados. Esto es para usar en scripts en archivos separados, como se explica a continuación.

Imprime el tercer campo siempre que el quinto campo coincida con la expresión regular /root/.

{ 
  if ( $5 !~ /root/ ) { 
          print $3 
  } 
}

Cuando el campo 5 no coincide /root/, imprime el campo tres. Esto usa el tipo C if declaración, que también es compatible con awk. Este formato permite una mayor flexibilidad para los programadores familiarizados con los lenguajes de propósito general.

Guardar guiones en archivos

Los scripts Awk también se pueden guardar en archivos que le permiten guardar programas más complejos:

awk -f ~/scripts/program.awk data

Al usar el -f flag, awk ejecuta el script en la ruta de archivo especificada, a saber program.awk. Los comandos en ese programa procesarán el archivo «datos».

Las acciones también se pueden ejecutar antes y después del programa, usando BEGIN y END:

BEGIN { FS=":" } # indicates that : is the field separator for the program.
 
#operations
 
END   { print "You're done" } # prints a joyful message for the user

Como puede ver arriba, el # El símbolo inicia un comentario, que dura hasta el final de la línea.

Conclusión

Esta guía solo toca los elementos más básicos de awk. Hay mucho más para construir y explorar más allá de esto. Examina el Documentación GNU para awk o El lenguaje de programación Awky el libro de texto awk escrito por los desarrolladores del programa.

Experto Geek - Tu Guía en Tendencias Tecnológicas