Introducción a Awk

Awk no es solo un programa utilitario sino también un lenguaje de programación, lo que lo hace además útil a la hora de crear scripts. Fue diseñado para extraer datos y para el procesamiento de textos. Gracias a su versatilidad es una herramienta popular entre los sysadmins y programadores de sistemas operativos Unix y GNU/Linux.

Esta introducción al lenguaje de programación Awk forma parte de los cursos de shell scripts que he facilitado recientemente, espero os sea de utilidad.

Introducción a Awk

La primera versión de este lenguaje fue escrita en 1977 en los laboratorios de Bell AT&T por Alfred V. Aho, Peter J. Weinberger, y Brian W. Kernighan. Su nombre proviene de las iniciales de los apellidos de estos autores. A lo largo de los años el lenguaje ha ido evolucionando, actualmente se encuentra en la versión 4.1.4, y tiene además dos variantes: Gawk y Nawk.

Gawk es la implementación del proyecto GNU del lenguaje de programación Awk ajustada a la definición del idioma en el estándar POSIX 1003.1. Proporciona funciones adicionales y una serie de extensiones específicas de GNU para el sistema operativo. Nawk es otra versión de Awk más reciente y mejorada.

Como características del lenguaje se puede decir que:

  • Es interpretado, utiliza la utilidad awk para ejecutar los programas, y
  • No es fuertemente tipado (strongly typed), todos los datos son considerados cadenas de texto pero si esa cadena es un número, se pueden realizar operaciones matemáticas en la misma.

De las funcionalidades de Awk se pueden destacar:

  • Escanea línea por línea de texto,
  • Divide un fichero en múltiples campos,
  • Busca texto dentro de un fichero y lo compara,
  • Da formato al texto,
  • Ejecuta operaciones aritméticas, y
  • Aplica condiciones a la salida deseada.

Expresiones y patrones en Awk

La utilidad awk ejecuta los programas escritos en el lenguaje de programación Awk, que está especializado en la manipulación de datos textuales. Un programa awk es una secuencia de patrones y sus acciones correspondientes; cuando se lee una entrada que coincide con un patrón, se lleva a cabo la acción asociada con el mismo.

Todo programa en Awk sigue este patrón, siendo sus partes opcionales:

awk 'BEGIN { inicialización } patrón de búsqueda 1 { acciones del programa } patrón de búsqueda 2 { acciones del programa } ... END { acciones finales }' fichero de entrada

Aquí vemos algunos ejemplos:

Para programar el clásico "Hola Mundo":

awk 'BEGIN { print "Hola Mundo!" }'

Un ejemplo obteniendo datos de un comando:

dpkg -l | awk ' { print $2, $3 } ' > instalados.txt

En este caso awk creará un fichero llamado instalados.txt con un listado de la segunda y la tercera columna del comando dpkg -l. Este comando muestra el nombre de los programas instalados en nuestro ordenador.

Los caracteres \t insertan tab, \n insertan un salto de línea. Los caracteres $ ’ \ y '' deben ser precedidos por la barra invertida \ dentro de comillas dobles para ser pasados literalmente al programa.

# El mismo comando utilizando indentado y final de línea
dpkg -l | awk '{ print $2 "\t" $3 "\n" }'

Si se desea imprimir todas las columnas:

dpkg -l | awk ' {print $0} ' > instalados.txt

Para buscar la palabra vim dentro del fichero anteriormente creado:

awk '/vim/ {print}' instalados.txt

Ejemplos y ficheros .awk

Para crear un fichero programado en Awk, abrimos un editor de texto y escribimos:

BEGIN {
print "El texto buscado: "
}
/vim/ { print $0 }
END {
print " --------- "
}

Lo guardamos como awk_buscar.awk y lo ejecutamos:

awk -f awk_buscar.awk instalados.txt

Otra opción es incluir la línea de ejecución dentro del fichero:

#!/usr/bin/awk -f

Luego se puede ejecutar como cualquier shell script desde la línea de comando.

Para incluir otros ficheros en un programa Gawk utiliza @include “fichero”:

# Fichero ejemplo1.awk
BEGIN { print “Este programa ejecuta Ejemplo 1” }
# Fichero ejemplo2.awk@include “ejemplo1.awk”
BEGIN { print “Este programa ejecuta Ejemplo 2” }

Bibliografía y referencias

FSF. GAWK: Effective AWK Programming: A User’s Guide for GNU Awk, for the 5.1.0 (or later) version  of the GNU implementation of AWK. (2020). Recuperado de http://www.gnu.org/software/gawk/manual/gawk.html.
Sundeep Agarwal. Learn by example: GNU Awk {Awesome one-liners}. (2021). Recuperado de https://github.com/learnbyexample/learn_gnuawk.
Pement, Eric. Handy one-line scripts for awk. (2019). Recuperado de
http://www.pement.org/awk/awk1line.txt.
IEEE and The Open Group. The Open Group Base Specifications Issue 7, 2018 edition. IEEE Std 1003.1-2017 (Revision of IEEE Std 1003.1-2008). (2018). Recuperado de: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html.
Barnett, Bruce. Awk. Part of the Unix tutorials. (2020). Recuperado de
https://www.grymoire.com/Unix/Awk.html.
CATONMAT. Awk One-Liners Explained, Part I: File Spacing, Numbering and Calculations (2021). Recuperado de https://catonmat.net/awk-one-liners-explained-part-one.

Si buscas un formador para realizar este curso u otra actividad formativa (webinar, workshops, bootcamps, etc.) en tu organización, me puedes ubicar a través de la página de contacto. Muchas gracias.

Si te ha gustado el artículo puedes ayudarme haciendo una donación con criptomonedas. Gracias!!!

 

Foto de Tom Fisk de Pexels https://www.pexels.com