Awk es una herramienta poderosa y versátil utilizada en sistemas Unix/Linux para buscar líneas que contienen ciertos patrones en archivos de texto y realizar acciones específicas sobre esas líneas. Este comando es esencial en el arsenal de cualquier administrador de sistemas o usuario avanzado que necesite procesar y manipular datos de forma eficiente. En este artículo, exploraremos los fundamentos de Awk y algunos de sus usos más comunes.
Fundamentos de Awk
Cuando se ejecuta Awk, se especifica un programa Awk que le indica qué hacer. Este programa consta de una serie de reglas, donde cada regla especifica un patrón a buscar y una acción a realizar cuando se encuentra dicho patrón. Sintácticamente, una regla consta de un patrón seguido de una acción, donde la acción está encerrada entre llaves para separarla del patrón. Las reglas en un programa Awk suelen estar separadas por nuevas líneas.
Un programa Awk tiene una estructura básica como esta:
patrón { acción }
patrón { acción }
Ejemplos de Uso Comunes
- Buscar un Patrón en un Archivo:
Para buscar un patrón específico en un archivo, simplemente ejecutamos:
awk '/<patrón>/' <archivo>
- Buscar Líneas que NO Contengan un Patrón:
Para buscar líneas que no contengan un patrón específico en un archivo:
awk '!/<patrón>/' <archivo>
- Buscar Líneas que Contengan Dos Patrones:
Si queremos buscar líneas que contengan dos patrones simultáneamente:
awk '/<patrón1>/ && /<patrón2>/' <archivo>
- Buscar Líneas que Contengan Uno de Dos Patrones:
Para buscar líneas que contengan uno de dos patrones:
awk '/<patrón1>/ || /<patrón2>/' <archivo>
- Ejecutar un Programa Awk desde un Archivo:
Si tenemos un programa Awk almacenado en un archivo y queremos ejecutarlo:
awk -f <programa.awk> <archivo1> ... <archivon>
- Seleccionar el Enésimo Campo de la Salida de un Comando Linux:
Para seleccionar el enésimo campo de la salida de un comando Linux:
<comando Linux> | awk '{print $<n>}'
- Contar el Número de Campos en la Salida Separada por Comas:
Si queremos contar el número de campos en la salida de un comando Linux separada por comas:
<comando Linux> | awk -F "," '{print NF}'
Aquí tienes una lista de ejemplos avanzados de uso de Awk. Estos ejemplos cubren una variedad de casos de uso, desde manipulación de archivos hasta análisis de datos:
- Imprimir la primera columna de un archivo:
awk '{print $1}' archivo.txt
- Sumar los valores de la segunda columna de un archivo:
awk '{sum += $2} END {print sum}' archivo.txt
- Encontrar y reemplazar un patrón en un archivo:
awk '{gsub("patrón", "reemplazo")} 1' archivo.txt
- Filtrar líneas que contienen un patrón específico:
awk '/patrón/' archivo.txt
- Filtrar líneas que comienzan con una letra específica:
awk '/^A/' archivo.txt
- Filtrar líneas que terminan con un número específico:
awk '/5$/' archivo.txt
- Imprimir líneas de un archivo en orden inverso:
awk '{a[i++] = $0} END {for (j=i-1; j>=0;) print a[j--] }' archivo.txt
- Contar el número total de líneas en un archivo:
awk 'END {print NR}' archivo.txt
- Imprimir líneas que contienen más de 10 caracteres:
awk 'length($0) > 10' archivo.txt
- Concatenar dos archivos línea por línea:
awk 'NR==FNR{a[NR]=$0;next} {print a[FNR],$0}' archivo1.txt archivo2.txt
- Ordenar un archivo basado en la segunda columna:
awk '{print $0 | "sort -k2"}' archivo.txt
- Encontrar la longitud máxima de una línea en un archivo:
awk '{if (length($0) > max) max = length($0)} END {print max}' archivo.txt
- Calcular el promedio de la tercera columna de un archivo:
awk '{sum += $3} END {print sum/NR}' archivo.txt
- Convertir texto en minúsculas:
awk '{print tolower($0)}' archivo.txt
- Convertir texto en mayúsculas:
awk '{print toupper($0)}' archivo.txt
- Imprimir líneas únicas en un archivo:
awk '!seen[$0]++' archivo.txt
- Reemplazar caracteres específicos en una columna:
awk '{gsub("old", "new", $2)} 1' archivo.txt
- Eliminar líneas duplicadas de un archivo:
awk '!x[$0]++' archivo.txt
- Imprimir líneas entre dos patrones específicos:
awk '/inicio/,/fin/' archivo.txt
- Contar el número de palabras en un archivo:
awk '{word += NF} END {print word}' archivo.txt
- Eliminar líneas en blanco de un archivo:
awk NF archivo.txt
- Reversar el contenido de cada línea en un archivo:
awk '{for(i=NF;i>=1;i--) printf "%s ",$i;print ""}' archivo.txt
- Encontrar la frecuencia de cada palabra en un archivo:
awk '{for (i=1; i<=NF; i++) count[$i]++} END {for (word in count) print word, count[word]}' archivo.txt
- Encontrar la suma de una columna condicionalmente:
awk '{if ($2 > 10) sum += $2} END {print sum}' archivo.txt
- Ordenar un archivo basado en el contenido de una columna numérica:
awk '{print $0 | "sort -nk2"}' archivo.txt
- Encontrar la longitud promedio de las líneas en un archivo:
awk '{sum += length($0)} END {print sum/NR}' archivo.txt
- Imprimir las líneas que contienen números:
awk '/[0-9]/' archivo.txt
- Imprimir el número de líneas que contienen un patrón:
awk '/patrón/{count++} END {print count}' archivo.txt
- Multiplicar dos columnas y mostrar el resultado:
awk '{print $1 * $2}' archivo.txt
- Calcular el total de una columna y agregarlo al final:
awk '{sum += $1} END {print sum}' archivo.txt
- Imprimir líneas que contienen solo caracteres alfabéticos:
awk '/^[[:alpha:]]*$/' archivo.txt
- Eliminar líneas que contienen caracteres no imprimibles:
awk '!/[^[:print:]]/' archivo.txt
- Calcular el valor máximo en una columna:
awk '{if ($1 > max) max = $1} END {print max}' archivo.txt
- Imprimir líneas que contienen una fecha específica:
awk '/Jan 1 10/' archivo.txt
- Reemplazar una cadena específica en un archivo:
awk '{gsub("old", "new")} 1' archivo.txt
- Calcular el promedio de una columna condicionalmente:
awk '{if ($2 > 10) {sum += $2; count++}} END {print sum/count}' archivo.txt
- Eliminar duplicados basados en la primera columna:
awk '!x[$1]++' archivo.txt
- Dividir un archivo en varios archivos basados en el valor de una columna:
awk '{print > $1 ".txt"}' archivo.txt
- Imprimir el número de caracteres en cada línea:
awk '{print length}' archivo.txt
Conclusión
Awk es una herramienta poderosa para el procesamiento de texto en sistemas Unix/Linux. Su capacidad para buscar patrones y realizar acciones específicas lo convierte en una herramienta invaluable para tareas de administración de sistemas, análisis de datos y mucho más. Con una comprensión básica de su sintaxis y algunos ejemplos de uso común, los usuarios pueden aprovechar al máximo el potencial de Awk en sus flujos de trabajo diarios.