AWK: una introducción a esta excelente herramienta

Publicado por Diego Córdoba en

tux_awk awkAWK es una pequeña y rápida herramienta que permite realizar varias tareas en un intérprete de comandos, y facilitarnos el trabajo a los sysadmin’s.


El principal uso de esta excelente herramienta es el de filtrar por columnas los datos de una lista o tabla tomada desde el stdin. Así, las variables $i corresponden con el valor de la i-esima columna del listado.

ls -l / | awk '{print $1}'
total
drwxr-xr-x
drwxr-xr-x
drwxr-xr-x
drwxr-xr-x
drwxr-xr-x
...

Podemos mostrar varias columnas de la siguiente forma:

ls -l / | awk '{print $1, $2}'
[diego@debian ~]$ ls -l / | awk '{print $1, $2}'
total 88
drwxr-xr-x 2
drwxr-xr-x 3
drwxr-xr-x 13
drwxr-xr-x 156
...

También podemos cambiar, mediante la opción -F, el delimitador de columnas, como sigue:

[diego@debian ~]$ awk < /etc/passwd -F: '{ print $7 }'
/bin/bash
/bin/sh
/bin/sh
/bin/sh
/bin/sync
...

Operaciones aritméticas con awk

Veamos ahora un pequeño ejemplo en el que podemos realizar una operación aritmética con awk, le pasamos un numero de bytes y nos calcula los KiB correspondientes:

echo 3456 | awk '{ print ($1/1024)" KiB" }'
3.375 KiB

Además, cabe notar

echo 11 22 | awk '{ print $1 + $2 }'

imprime 33, mientras que:

echo 11 22 | awk '{ print $1 $2 }'

imprime 1122, y

echo 11 22 | awk '{ print $1, $2 }'

imprime «11 22».

Uso de variables

En awk existen además algunas variables particulares, además de $1, $2, etc, que marcan el contenido de cada columna. NF por ejemplo hace referencia al último elemento de la lista, mientras que $0 almacena la entrada completa.

Veamos un ejemplo

echo "hola mundo, que tal" |awk '{print $NF}'
tal

echo "hola mundo, que tal" |awk '{print $0}'
hola mundo, que tal

Además, también podemos crear nuestras propias variables utilizando nombres particulares que no coincidan con las palabras reservadas de awk. No es necesario declarar las variables en el lenguaje.

Supongamos que la salida del comando en cuestión es una tabla, nosotros podríamos calcular el promedio de cada línea de la siguiente manera:

echo "11 22 33" | awk '{ total=0; for (i=1; i<=NF; i++) total += $i; \
> print total/NF; }'
22

Como se podrá apreciar, la sintaxis de la programación de control de _awk_ es similar a la del lenguaje C 🙂

Bloques de código

Podemos tener varios bloques de instrucciones etiquetados, por ejemplo, si queremos mostrar algo antes de proceder a trabajar con las entradas, podemos crear un bloque BEGIN. Igualmente para END al ejecutar código al final del análisis:

Veamos cómo podemos agregar una cabecera y un pie a la siguiente salida de nombres de archivos:tamaño:

ls -l / |awk 'BEGIN { print "iniciando______________" } {print $9":"$5 } \
> END {print "finalizando_______________"}'

iniciando______________
bin:4096
boot:4096
dev:3420
etc:12288
home:4096
initrd.img:29
initrd.img.old:29
lib:4096
[...]
var:4096
vmlinuz:25
vmlinuz.old:25
finalizando_______________

O incluso más, calculemos el total de lo que suman los tamaños de los archivos!

ls -l / |awk 'BEGIN { print "iniciando______________";total } \
> {print $9":"$5; total +=$5 } END {print "finalizando_______________: Total: " total}'

iniciando______________
bin:4096
boot:4096
dev:3420
etc:12288
home:4096
initrd.img:29
initrd.img.old:29
[...]
run:920
sbin:12288
srv:4096
sys:0
tmp:4096
usr:4096
var:4096
vmlinuz:25
vmlinuz.old:25
finalizando_______________: Total: 98656

La sintaxis de los bucles es exactamente la misma que en lenguaje C, veamos un ejemplo de while muy simple:

echo ""|awk '{ i=0; while(i<10) {print i; i++;} }'

0
1
2
3
4
5
6
7
8
9

Y si nos gusta programar en C, aquí la despedida 🙂

echo «Hasta la proxima»| awk ‘{for(i=1;i<=NF;i++){printf «%s «, $i;system(«sleep 1»)};print «!! :-)»}’

Conclusión

AWK es todo un lenguaje de programación, en este artículo hemos citado algunos ejemplos útiles, pero la realidad es que es uno de los comandos más potentes de la línea de comandos.

Sin ir más lejos, se han escrito libros enteros explicando sus funcionalidades, que incluyentux_util

  • Effective_awk_Programming de Arnold Robbins
  • The_AWK_Programming Language, de Aho, Kernighan  y Weinberger.
  • Sed_&_Awk, de Dougherty y Robbinson

O, una excelente guía de la versión GPL de _awk_: gawk, que puede descargarse directamente desde el sitio de la GNU:

https://www.gnu.org/software/gawk/


Video explicativo en nuestro canal de youtube!

¡¡Hasta la próxima!!


Diego Córdoba

- Ingeniero en Informática - Mg. Teleinformática - Tesis pendiente - Docente universitario - Investigador