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