¿Cómo dominar el comando AWK para procesar textos en Linux?

El comando AWK es una herramienta potente y versátil para procesar y transformar datos de texto en Linux. Ya sea que necesite extraer información, filtrar líneas, reformatear la salida o realizar cálculos, AWK simplifica su trabajo con tan solo unas pocas líneas de código. En este artículo, aprenderá a usar el comando AWK para manipular texto en Linux.

¿Qué es el comando AWK?

El comando AWK es un lenguaje de programación interpretado que se ejecuta en la terminal de Linux. Su nombre proviene de las iniciales de sus creadores: Alfred Aho, Peter Weinberger y Brian Kernighan. AWK fue diseñado originalmente para manejar archivos estructurados con campos separados por delimitadores, como archivos CSV o archivos /etc/passwd. Sin embargo, AWK también puede manipular archivos de texto más complejos, como archivos HTML o XML. AWK no es un lenguaje de programación orientado a objetos, pero permite la definición de funciones y variables locales y globales. También cuenta con estructuras de control como bucles y sentencias condicionales.

La sintaxis general del comando AWK es la siguiente:

awk [opciones] 'programa' [archivos]

El programa consiste en una secuencia de instrucciones que definen patrones de búsqueda en cada línea del archivo , así como acciones a realizar cuando se encuentra un patrón. Las opciones permiten modificar el comportamiento del comando AWK, como por ejemplo, elegir el delimitador de campo o el formato de salida.

¿Cómo imprimo texto usando el comando AWK?

El comando AWK permite imprimir un mensaje en la terminal según un patrón en el texto. Si se ejecuta el comando AWK sin ningún patrón y solo con un comando de impresión, AWK imprimirá el mensaje cada vez que se presione Intro.

Por ejemplo, si escribes:

awk '{imprimir "Hola"}'

Y si presionas Enter varias veces, obtendrás:

Hola, hola, hola

Para detener el comando AWK, puede presionar Ctrl+C.

Si desea imprimir el contenido de un archivo utilizando el comando AWK, puede usar el patrón especial `BEGIN`, que se ejecuta antes de leer el archivo, y el patrón especial `END`, que se ejecuta después de leer el archivo. Por ejemplo, si tiene un archivo llamado `test.txt` que contiene:

Esto es una prueba. AWK es una gran herramienta. Linux es el mejor sistema operativo

Puede imprimir el contenido del archivo utilizando el siguiente comando:

awk 'BEGIN {print "Aquí está el contenido del archivo test.txt:"} {print} END {print "Fin del archivo"}' test.txt

Lo que da:

Aquí está el contenido del archivo test.txt: Esto es una prueba. AWK es una herramienta excelente. Linux es el mejor sistema operativo. Fin del archivo

comando {print} sin argumentos imprime la línea completa. También puede imprimir un campo específico usando la variable $n, donde n es el número de campo. Por defecto, los campos están separados por espacios o tabulaciones, pero puede cambiar el delimitador con la -F.

Por ejemplo, si desea imprimir el primer y el tercer campo del /etc/passwd, que están separados por dos puntos (:), puede utilizar el siguiente comando:

awk -F: '{imprimir $1 " " $3}' /etc/passwd

Lo que da algo como:

raíz 0 demonio 1 bin 2 sys 3 sync 4 juegos 5 man 6 lp 7 correo 8 noticias 9 uucp 10 proxy 13 www-data 33 ...

También puedes imprimir expresiones aritméticas o cadenas de texto usando el comando AWK. Por ejemplo, si quieres imprimir el cuadrado del segundo campo del archivo test.txt, puedes usar el siguiente comando:

awk '{imprimir $2^2}' prueba.txt

Lo que da:

tiene 16 años

Si desea imprimir el número de líneas del archivo test.txt, puede usar la variable especial NR, que contiene el número de línea actual. Por ejemplo, puede usar el siguiente comando:

awk 'FIN {imprimir NR}' prueba.txt

Lo que da:

3

¿Cómo filtrar texto usando el comando AWK?

El comando AWK permite filtrar texto según patrones o condiciones. Si se especifica un patrón antes de una acción, AWK solo ejecutará la acción si se encuentra en la línea. El patrón puede ser una expresión regular, una comparación, una operación lógica o una combinación de estas.

Por ejemplo, si desea imprimir las líneas del test.txt que contienen la palabra Linux, puede utilizar el siguiente comando:

awk '/Linux/ {print}' prueba.txt

Lo que da:

Linux es el mejor sistema operativo

Si desea imprimir las líneas del /etc/passwd que tengan un UID mayor que 1000, puede utilizar el siguiente comando:

awk -F: '$3 > 1000 {imprimir}' /etc/passwd

Lo que da algo como:

systemd-coredump:x:997:997:systemd Core Dumper:/:/usr/sbin/nologin tss:x:131:142:Pila de software TPM,,,:/var/lib/tpm:/bin/false _rpc:x:132:65534::/run/rpcbind:/usr/sbin/nologin statd:x:133:65534::/var/lib/nfs:/usr/sbin/nologin libvirt-qemu:x:64055:139:Libvirt Qemu,,,:/var/lib/libvirt:/usr/sbin/nologin libvirt-dnsmasq:x:134:144:Libvirt Dnsmasq,,,:/var/lib/libvirt/dnsmasq:/usr/sbin/nologin snapd-range-524288-root:x:524288:524288::/inexistente:/bin/false snap_daemon:x:584788:584788::/inexistente:/bin/false ...

También puedes usar los operadores lógicos && (y), || (o) y ! (no) para combinar patrones. Por ejemplo, si quieres imprimir las líneas del /etc/passwd que tienen un UID mayor que 1000 y un intérprete de comandos distinto de /usr/sbin/nologin, puedes usar el siguiente comando:

awk -F: '$3 > 1000 && $7 != "/usr/sbin/nologin" {imprimir}' /etc/passwd

Copiar

Lo que da algo como:

tss:x:131:142:Pila de software TPM,,,:/var/lib/tpm:/bin/false _rpc:x:132:65534::/run/rpcbind:/usr/sbin/nologin statd:x:133:65534::/var/lib/nfs:/usr/sbin/nologin libvirt-qemu:x:64055:139:Libvirt Qemu,,,:/var/lib/libvirt:/usr/sbin/nologin libvirt-dnsmasq:x:134:144:Libvirt Dnsmasq,,,:/var/lib/libvirt/dnsmasq:/usr/sbin/nologin snapd-range-524288-root:x:524288:524288::/inexistente:/bin/false snap_daemon:x:584788:584788::/inexistente:/bin/false ...

¿Cómo editar texto usando el comando AWK?

El comando AWK se puede usar para modificar texto mediante funciones integradas o variables especiales. Por ejemplo, si desea reemplazar espacios por guiones en el archivo test.txt, puede usar la gsub, que reemplaza todas las ocurrencias de una cadena por otra. También puede usar la OFS, que define el separador de campos de salida. Por ejemplo, puede usar el siguiente comando:

awk '{print strftime("%d/%m/%Y %H:%M:%S",$1 " " $2)}' prueba.txt

Lo que da:

30/10/2021 16:13:49
31/10/2021 17:14:50
01/11/2021 18:15:51

Puede consultar el manual de comandos AWK para conocer otras funciones y variables disponibles.

¿Cómo utilizar el bucle for con el comando AWK?

El comando AWK permite ejecutar bucles for en los campos o líneas de un archivo. La sintaxis del bucle for es la siguiente:

para (variable en matriz) acción

Donde variable es el nombre de la variable que sucesivamente toma los valores del array, y acción es la acción que se realizará en cada iteración.

Por ejemplo, si desea imprimir los campos de un archivo en orden inverso, puede usar un bucle for con la variable especial NF, que contiene el número de campos en la línea actual. Por ejemplo, si tiene un archivo llamado test.txt que contiene:

Esto es una prueba. AWK es una gran herramienta. Linux es el mejor sistema operativo

Puede invertir el orden de los campos con el siguiente comando:

awk '{para (i=NF; i>0; i--) imprimir $i}' prueba.txt

Lo que da:

Una prueba es esta formidable herramienta; otra es AWK; el mejor sistema operativo es Linux

También puedes usar el bucle for para iterar a través de las líneas de un archivo con la variable especial FNR, que contiene el número de línea del archivo actual. Por ejemplo, si quieres imprimir las líneas pares del archivo test.txt, puedes usar el siguiente comando:

awk 'FNR%2==0 {imprimir FNR}' prueba.txt

Lo que da:

2
4

¿Cómo ejecuto un script AWK?

Para ejecutar un script AWK, puedes colocarlo en un archivo con la .awk y darle permisos de ejecución con el comando chmod +x. Luego, puedes ejecutar el script con el comando ./script_name.awk [archivos].

Por ejemplo, si tienes un script llamado hello.awk que contiene:

#!/usr/bin/awk -f BEGIN {imprimir "Hola"}

Puede ejecutar el script con el siguiente comando:

./hola.awk

Lo que da:

Buen día

¿Cómo paso argumentos a un script AWK?

Para pasar argumentos a un script AWK, puede utilizar dos métodos:

  • El primer método consiste en usar la -v con el formato variable=valor. Por ejemplo, si quieres pasar dos argumentos llamados var1 y var2 a tu hello.awk, puedes usar el siguiente comando:
awk -v var1=hola -v var2=mundo -f hola.awk 

Y en tu hello.awk, puedes acceder a los argumentos usando las variables $var1 y $var2. Por ejemplo, si tu script contiene:

#!/usr/bin/awk -f BEGIN {imprimir $var1 " " $var2}

Obtendrás:

Hola Mundo
  • El segundo método consiste en utilizar el array especial ARGV, que contiene los argumentos pasados ​​al script. Por ejemplo, si quieres pasar dos argumentos sin nombre a tu hello.awk, puedes usar el siguiente comando:
awk -f hola.awk hola mundo 

Y en tu hello.awk, puedes acceder a los argumentos usando los índices ARGV[1] y ARGV[2]. Por ejemplo, si tu script contiene:

#!/usr/bin/awk -f BEGIN {imprimir ARGV[1] " " ARGV[2]}

Obtendrás:

Hola Mundo

Preguntas frecuentes

¿Cuál es la diferencia entre AWK y GAWK?

GAWK es una implementación GNU de AWK, que agrega características adicionales al lenguaje original, como soporte para expresiones regulares extendidas, matrices multidimensionales o funciones predefinidas.

¿Cómo depuro un script AWK?

opción -W con el lint, que muestra mensajes de advertencia sobre posibles errores en el script. También puede usar la -W con el dump-variables, que muestra los valores de las variables al finalizar la ejecución del script.

¿Cómo uso el comando AWK para ordenar datos?

Para usar el comando AWK para ordenar datos, puede usar el `sort` en combinación con AWK. Por ejemplo, si desea ordenar los usuarios en el `/etc/passwd` por su UID, puede usar el siguiente comando:

awk -F: '{imprimir $1, $3}' /etc/passwd | sort -n -k2

Al combinar AWK con otros comandos (en este caso, sort), puedes ir mucho más allá a la hora de mostrar y organizar los datos.

¿Cómo imprimo el número de palabras en un archivo usando el comando AWK?

Para imprimir el número de palabras en un archivo usando el comando AWK, puede usar la variable especial NF, que contiene el número de campos en la línea actual, y la variable especial NR, que contiene el número de línea actual. Usando un bucle for, puede contar el número de palabras en cada línea y agregarlas a una variable llamada total. Usando el patrón especial END, puede imprimir el resultado final. Por ejemplo, si tiene un archivo llamado test.txt que contiene:

Esto es una prueba. AWK es una gran herramienta. Linux es el mejor sistema operativo

Puede imprimir el número de palabras en el archivo utilizando el siguiente comando:

awk '{para (i=1; i<=NF; i++) total++} FIN {imprimir total}' prueba.txt

Lo que da:

9

¿Cómo uso el comando AWK para extraer datos de un archivo CSV?

Para utilizar el comando AWK para extraer datos de un archivo CSV (valores separados por comas), puede usar la -F para establecer el separador de campos en una coma. Por ejemplo, si tiene un archivo llamado test.csv que contiene:

Apellido, nombre, edad: Alice Dupont, 25; Bob Martin, 32; Charles Durand, 28

Puede extraer el nombre y la edad de las personas utilizando el siguiente comando:

awk -F"," '{imprimir $1 " " $3}' prueba.csv

Lo que da:

Nombre, edad: Alice 25, Bob 32, Charles 28

¿Cómo filtrar datos usando el comando AWK?

El comando AWK permite filtrar datos según patrones, que son expresiones regulares o condiciones lógicas. Los patrones se colocan antes de las acciones, separados por llaves. Por ejemplo, si desea mostrar las líneas del archivo test.csv que contienen el nombre Alice, puede usar el siguiente patrón:

awk -F"," '/Alice/ {imprimir}' prueba.csv

Lo que da:

Alicia, Dupont, 25 años

Si desea mostrar las líneas del test.csv que tengan más de 30 años de antigüedad, puede utilizar el siguiente patrón:

awk -F"," '$3 > 30 {imprimir}' prueba.csv

Lo que da:

Bob, Martín, 32 años

Puedes combinar varios patrones usando los operadores lógicos && (y), || (o) y ! (no). Por ejemplo, si quieres mostrar las líneas del archivo test.csv cuyo nombre empiece por C o cuya edad sea inferior a 10 años, puedes usar el siguiente patrón:

awk -F"," '($1 ~ /^C/) || ($3 < 10) {imprimir}' prueba.csv

Lo que da:

CAMILLE,M,7 CLARA,F,11 CLEMENT,M,7

¿Cómo calcular estadísticas usando el comando AWK?

El comando AWK permite calcular estadísticas sobre los datos numéricos de un archivo, como la suma, el promedio, el mínimo o el máximo. Para ello, basta con usar variables para almacenar los valores intermedios y actualizarlas con cada línea. Mediante el patrón especial END, se puede mostrar el resultado final. Por ejemplo, si se desea calcular la suma y el promedio de las edades en el archivo test.csv, se puede usar el siguiente programa:

awk -F"," 'NR>1 {suma+=$3; conteo++} END {imprimir "Suma: " suma; imprimir 'Promedio: 'suma/conteo}' test.csv

Lo que da:

Total: 110 Promedio: 18.3333

Explicación:

  • se utiliza -F"," para definir el separador de campos como una coma.
  • Utilizamos la condición NR>1 para ignorar la primera línea del archivo, que contiene los nombres de las columnas.
  • Usamos las variables suma y recuento para acumular la suma y el número de edades. Usamos el operador += para incrementar las variables con el valor del tercer campo ($3).
  • patrón END operador / para calcular el promedio dividiendo la suma entre el número.

Del mismo modo, si desea calcular las edades mínima y máxima en el test.csv, puede utilizar el siguiente programa:

awk -F"," 'NR>1 {si (mín=="") mín=máx=$3; si ($3<min) min=$3; if ($3> máx.) máx.=$3} FIN {imprimir "Mín.: " min; imprimir 'Máx.: 'máx.}' test.csv

Lo que da:

Mín: 6 Máx: 32

Explicación:

  • se utiliza -F"," para definir el separador de campos como una coma.
  • Utilizamos la condición NR>1 para ignorar la primera línea del archivo, que contiene los nombres de las columnas.
  • Usamos las variables min y max para almacenar las edades mínima y máxima. Inicializamos estas variables con el valor del tercer campo ($3) si están vacías (""). Usamos los operadores < y > para comparar los valores y actualizar las variables si es necesario.
  • El END para mostrar el resultado final.

Conclusión

El comando AWK es una herramienta esencial para manipular texto en Linux. Permite realizar tareas complejas con tan solo unas pocas líneas de código, como extraer, filtrar, modificar o calcular datos. Ofrece una gran flexibilidad gracias a sus patrones, acciones, funciones y variables. Se puede combinar con otros comandos de Linux para ampliar sus capacidades. Por ejemplo, comando Echo Windows para mostrar un mensaje o una variable en pantalla. Si desea obtener más información sobre el comando AWK, puede consultar el manual o los numerosos tutoriales disponibles en línea.

Artículo anterior:¿Cómo proteger las transferencias de archivos con FTPS en Windows Server?
Siguiente artículo:¿Cómo conseguir YouTube Premium gratis?
Hola, soy François :) Un escritor en mi tiempo libre al que le encanta compartir su pasión: ¡todo lo relacionado con la tecnología! 😍 Ya sea hardware, software, videojuegos, redes sociales o cualquier otra área, lo encontrarás todo en este sitio. Comparto mis análisis, reseñas, tutoriales y mis hallazgos favoritos en varias plataformas. Soy un entusiasta de la tecnología con amplios conocimientos y perspicacia que no solo sigue las tendencias, sino que se esfuerza por guiarte hacia las mejores soluciones. ¡Así que mantente al tanto!