El comando awk en Linux: procesamiento avanzado de texto

Introducción

El comando awk es una de las herramientas más poderosas del entorno Unix/Linux para el procesamiento de texto. Aunque su sintaxis puede parecer críptica al principio, permite realizar filtrado, transformación y análisis de datos de forma rápida y sin necesidad de escribir scripts complejos en otros lenguajes. En este artículo exploraremos desde los conceptos básicos hasta técnicas avanzadas que le sacarán el máximo provecho a awk.

Sintaxis básica

La forma general de awk es: awk 'patrón { acción }' archivo. Si se omite el patrón, la acción se ejecuta en cada línea de entrada. Si se omite la acción, por defecto se imprime la línea completa. Los campos se acceden con $1, $2, etc., y $0 representa toda la línea.

Separadores de campos

Por defecto awk usa cualquier cantidad de espacios o tabulaciones como separador. Se puede cambiar con la opción -F o la variable interna FS. Por ejemplo, para procesar un archivo CSV se usa awk -F',' '{print $1,$3}' file.csv. También se puede usar expresiones regulares como separador, lo que resulta útil cuando los campos están divididos por varios caracteres.

Variables incorporadas

Awk proporciona varias variables útiles: NR (número de registro actual), NF (número de campos en el registro actual), FILENAME (nombre del archivo de entrada), OFS (separador de campo de salida) y ORS (separador de registro de salida). Modificar OFS y ORS permite cambiar el formato de salida sin afectar la lógica de procesamiento.

Estructuras de control

Awk soporta sentencias if‑else, bucles for y while, y arreglos asociativos. Esto permite realizar acumulaciones, conteos y operaciones más complejas. Por ejemplo, para contar cuántas veces aparece cada palabra en un texto se puede usar:

  • awk '{for(i=1;i<=NF;i++) freq[$i]++} END {for(w in freq) print w,freq[w]}' file

El bloque END se ejecuta después de procesar toda la entrada, ideal para imprimir resúmenes.

Funciones integradas

Awk incluye funciones matemáticas, de cadena y de tiempo. Algunas de las más usadas son length() (longitud de una cadena), substr() (extraer una subcadena), match() (expresión regular), toupper() y tolower(). También se pueden definir funciones propias con la palabra clave function.

Ejemplos prácticos

Análisis de logs

Supongamos un archivo de acceso de Apache con formato: IP - - [fecha] "método ruta protocolo" estado tamaño. Para obtener las IP que más solicitudes hicieron:

  • awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10

O bien, directamente con awk:

  • awk '{ip[$1]++} END {for(i in ip) print ip[i],i}' access.log | sort -nr

Procesamiento de CSV

Para extraer el segundo y cuarto campo de un archivo CSV y cambiar el separador de salida a punto y coma:

  • awk -F',' '{OFS=";"; print $2,$4}' datos.csv

Filtrado por condición

Mostrar solo las líneas donde el tercer campo sea mayor que 100:

  • awk '$3 > 100' file.txt

Consejos y trucos

  • Use -v para pasar variables de shell a awk: awk -v lim=50 '$2 > lim' file
  • Combine awk con otros comandos mediante tuberías para crear potentes flujos de trabajo.
  • Cuando necesite precisión numérica, use la función sprintf para controlar el formato de punto flotante.
  • Guarde scripts awk en archivos con extensión .awk y ejecútelos con awk -f script.awk archivo para mayor legibilidad.

Conclusión

Awk sigue siendo una herramienta indispensable para cualquier administrador de sistemas, desarrollador o analista de datos que trabaje en entornos Linux. Su capacidad de combinar patrones, acciones y programación estructurada lo convierte en una navaja suiza para el procesamiento de texto. Practicar los ejemplos presentados y explorar su documentación oficial le permitirá automatizar tareas que antes requerían scripts más largos y complejos.

Esta obra está bajo una Licencia Creative Commons Atribución 4.0 Internacional para Francesc Roig francesc@vivaldi.net .

EspañolesEspañolEspañol