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
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
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.
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
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.