Manipulación de Datos con AWK: Delimitadores, Campos y Patrones

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 ($NF es 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:

  1. 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 llamado ipCounts. 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.
  2. 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 array ipCounts. La variable ip tomará el valor de cada clave en cada iteración.
    • print ip, ipCounts[ip]: Imprime la dirección IP (la clave ip) seguida de su respectivo contador (el valor ipCounts[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.

Etiquetas: AWK procesamiento de texto expresiones regulares scripts de shell Análisis de Logs

Publicado el 9-11 00:22