AWK es una potente herramienta de procesamiento de texto en Unix/Linux, ideal para analizar y transformar datos estructurados. Permite especificar delimitadores para campos, extraer columnas específicas y aplicar lógica condicioanl basada en patrones.
Ejemplo 1: Extracción de Columnas con Delimitador Personalizado
Podemos definir el separador de campos usando la opción -F. Si queremos imprimir la última columna de un archivo donde los campos están separados por comas (,), podemos usar el siguiente comando:
# Supongamos un archivo llamado 'datos.csv' con contenido como:
# nombre,edad,ciudad
# Ana,30,Madrid
# Luis,25,Barcelona
# Carmen,35,Valencia
awk -F',' '{print $NF}' datos.csv
Explicación:
-F',': Establece la coma como el delimitador de campos.'{print $NF}': Imprime el último campo ($NFes una variable especial en AWK que representa el número total de campos en la línea actual).
Salida esperada para 'datos.csv':
ciudad
Madrid
Barcelona
Valencia
Ejemplo 2: Filtrado de Líneas Basado en Patrones
AWK puede filtrar líneas que coincidan o no coincidan con expresiones regulares. Para imprimir todas las líneas de un archivo de log (/var/log/messages) que no terminen con la cadena "bash", se puede utilizar:
awk '!/bash$/' /var/log/messages
Explicación:
!/bash$/: Esta es la condición. El signo de exclamación (!) niega la coincidencia./bash$/busca la cadena "bash" al final de la línea ($indica el final de la línea). Por lo tanto, la condición es verdadera para líneas que no terminan en "bash".
Nota: Si la cadena a buscar contiene caracteres especiales como '/', es recomendable escaparlos con una barra invertida '\'.
Ejemplo 3: Análisis de Logs con Conteo de Ocurrencias
Un uso común de AWK es contar la frecuencia de elementos en archivos de log, como las direcciones IP. Consideremos un log simplificado donde cada línea contiene una dirección IP:
# Contenido de '/var/log/access.log' (simplificado):
# 172.40.1.18
# 172.40.1.17
# 172.40.1.18
# 172.40.1.17
# 172.40.1.16
# 172.40.1.18
awk '{ ipCounts[$1]++ } END { for (ip in ipCounts) print ip, ipCounts[ip] }' /var/log/access.log
Análisis del Comando:
El comando AWK se divide en dos fases principales:
- Procesamiento por Línea (Bloque Principal):
{ ipCounts[$1]++ }$1: Representa el primer campo de la línea actual (en este caso, la dirección IP, ya que cada línea solo tiene una).ipCounts[...]: Se utiliza un array asociativo llamadoipCounts. La dirección IP actúa como la clave (índice) del array.++: Incrementa el valor asociado a la clave (la IP) en 1. Si la IP no ha sido vista antes, AWK la inicializa con un valor de 0 antes de incrementarla a 1.
- Bloque END (Post-procesamiento):
END { for (ip in ipCounts) print ip, ipCounts[ip] }END: Este bloque se ejecuta una sola vez después de que todas las líneas del archivo de entrada han sido procesadas.for (ip in ipCounts): Itera sobre todas las claves (direcciones IP) almacenadas en el arrayipCounts. La variableiptomará el valor de cada clave en cada iteración.print ip, ipCounts[ip]: Imprime la dirección IP (la claveip) seguida de su respectivo contador (el valoripCounts[ip]).
Salida Esperada:
172.40.1.16 1
172.40.1.17 2
172.40.1.18 3
Este ejemplo demuestra cómo AWK puede agregarr datos de manera eficiente, contando las ocurrencias de cada IP única en el archivo de log.