Generación de Reportes de Texto con awk/gawk en Linux

awk, referenciado como gawk, es un potente lenguaje de procesamiento de texto en entornos Linux y Unix, diseñado para formatear y manipular datos de manera eficiente. Su sintaxis se basa en patrones y acciones: cada instrucción awk define condiciones para activar operaciones específicas sobre las líneas de entrada.

Estructura de Instrucciones

Las instrucciones awk combinan patrones y acciones. Los patrones incluyen expresiones regulares como /[a-z]+/, operadores relacionales (==, !=), operadores regex (~, !~), operadores aritméticos (+, -), lógicos (&&, ||) y el operador de campo $. Las acciones pueden contener variables, comandos, funciones integradas y estructuras de control.

Sintaxis Básica

La sintaxis general es: awk [opciones] 'BEGIN{inicio} patrón{acción} END{fin}' archivo. Los bloques BEGIN y END son opcionales y se ejecutan una sola vez, antes y después del procesamiento de líneas, respectivamente.

Módulos BEGIN y END

BEGIN se usa para inicializar variables o configurar separadores, mientras que END se emplea para resumir resultados o imprimir cierres. Por ejemplo:

awk 'BEGIN{print "Inicio"} {print $0} END{print "Fin"}' archivo.txt

Proceso de Ejecución

El flujo de ejecución de awk es:

  1. Ejecutar el bloque BEGIN.
  2. Leer una línea de la entrada estándar o archivo.
  3. Procesar la línea con las instrucciones del bloque de trabajo.
  4. Repetir los pasos 2 y 3 hasta el final de la entrada.
  5. Ejecutar el bloque END.

Variables Integradas

awk proporciona variables predefinidas para acceder a datos durante la ejecución:

  • $0: contenido completo de la línea actual.
  • $n: el n-ésimo campo de la línea.
  • FS: separador de campos de entrada (por defecto, espacio).
  • RS: separador de registros de entrada (por defecto, salto de línea).
  • NF: número de campos en la línea actual.
  • NR: número total de líneas procesdaas.
  • FNR: número de línea en el archivo actual.
  • OFS: separador de campos de salida (por defecto, espacio).
  • ORS: separador de registros de salida (por defecto, salto de línea).
  • FILENAME: nombre del archivo en procesamiento.

Opciones Comunes

Algunas opcinoes clave de awk:

  • -f archivo: ejecuta comandos desde un script.
  • -F separador: define el separador de campos.
  • -v var=valor: asigna valores a variables.

Ejemplos Prácticos

Definición de Separadores

Para establecer separadores, se puede usar la opción -F o la variable FS en un bloque BEGIN:

echo "X,Y,Z" | awk -F, '{print $2}'
echo "X,Y;Z" | awk -F"[,;]" '{print $2}'
echo "X,Y;Z" | awk 'BEGIN{FS=","} {print $2}'

Uso de Variables Integradas

Ejemplo con FS, OFS, RS y ORS:

echo -e "user:pass\nadmin:secret" | awk 'BEGIN{FS=":"; OFS="|"; ORS=" "} {print $1}'
# Salida: user admin

Mostrar el número de campos por línea:

echo -e "a:b:c\nx:y" | awk -F: '{print NF}'
# Salida: 3
#          2

Uso de FNR y NR con múltiples archivos:

awk '{print FNR}' archivo1 archivo2
awk '{print NR}' archivo1 archivo2

Variables Externas y Arrays

awk permite pasar variables externas y manejar arrays:

valor="test"
echo | awk -v msg="$valor" '{print msg}'
# Array con índices numéricos y de cadena
awk 'BEGIN{arr[1]="uno"; arr["dos"]=2; print arr[1], arr["dos"]}'
# Dividir cadenas en arrays
awk 'BEGIN{str="hola mundo"; split(str, palabras, " "); print palabras[2]}'

Función printf para Formateo

La función printf ofrece control preciso sobre la salida. Ejemplo:

echo "data" | awk '{printf "%-10s %s\n", "Valor:", $1}'
# Formatear con anchura fija
awk -F: '/root/{printf "%-15s %s\n", $1, $NF}' /etc/passwd

Control de Flujo

Estructuras condicionales y bucles en awk:

# Condición if
awk '{if ($1 > 10) print "Alto"; else print "Bajo"}' datos.txt

# Bucle for
awk 'BEGIN{for (i=1; i<=5; i++) print i}'

# Bucle while
awk '{n=1; while (n <= NF) {print $n; n++}}' archivo

Integración con Shell

Ejecutar comandos del sistema usando system():

awk '{cmd="echo Procesando "$0; system(cmd)}' lista.txt

Etiquetas: AWK gawk linux-command text-processing report-generation

Publicado el 7-15 21:09