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:
- Ejecutar el bloque
BEGIN. - Leer una línea de la entrada estándar o archivo.
- Procesar la línea con las instrucciones del bloque de trabajo.
- Repetir los pasos 2 y 3 hasta el final de la entrada.
- 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