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

El comando AWK es una herramienta poderosa y versátil para procesar y transformar datos de texto en Linux. Ya sea extrayendo información, filtrando filas, reformateando la salida o realizando cálculos, AWK puede hacerle la vida más fácil con sólo unas pocas líneas de código. En este artículo, aprenderá cómo utilizar el comando AWK para la manipulación de texto en Linux.

¿Qué es el comando AWK?

El lenguaje de programación AWK.svg

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 procesar archivos estructurados en campos separados por delimitadores, como archivos CSV o archivos /etc/passwd. Pero AWK también puede manejar archivos de texto más complejos, como archivos HTML o XML. AWK no es un mejores-memoria-ram-a-objetos-/" target="_blank">lenguaje de programación orientado a objetos , pero permite definir funciones y variables locales o globales. También tiene estructuras de control como bucles y condiciones.

La sintaxis general del comando AWK es la siguiente:

awk [opciones] 'programa' [archivos]

El programa es una serie de instrucciones que definen patrones a buscar en cada línea del archivo y acciones a realizar cuando se encuentra un patrón. Las opciones le permiten modificar el comportamiento del comando AWK, como la elección del delimitador de campo o el formato de salida.

¿Cómo imprimir texto con el comando AWK?

Cómo utilizar el comando Awk en Linux

El comando AWK se puede utilizar para imprimir un mensaje en la terminal según un patrón en el texto. Si ejecuta el comando AWK sin ningún motivo y solo un comando de impresión, AWK imprime el mensaje cada vez que presiona Enter.

Por ejemplo, si escribe:

awk '{imprimir "Hola"}'

Y presionas Enter varias veces, obtienes:

Buenos días, buenos días, buenos días.

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

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

Esta es una prueba AWK es una gran herramienta Linux es el mejor sistema operativo

Puede imprimir el contenido del archivo con el siguiente comando:

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

que dan:

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

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

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

awk -F: '{imprimir $1 " " $3}' /etc/contraseña

Lo que da algo como:

raíz 0 demonio 1 bin 2 sys 3 sincronización 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 caracteres con el comando AWK. Por ejemplo, si desea imprimir el cuadrado del segundo campo del test.txt , puede utilizar el siguiente comando:

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

que dan:

es 16 es

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

awk 'FIN {imprimir NR}' prueba.txt

que dan:

3

¿Cómo filtrar texto con el comando AWK?

dl.beatsnoop.com pulgar 1687289446

El comando AWK se puede utilizar para filtrar texto según patrones o condiciones. Si especifica un patrón antes de una acción, AWK solo realiza la acción si el patrón se encuentra en la fila. El patrón puede ser una expresión regular, una comparación, una operación lógica o una combinación de ellas.

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

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

que dan:

Linux es el mejor sistema operativo

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

awk -F: '$3 > 1000 {imprimir}' /etc/contraseña

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::/nonexistent:/bin/false snap_daemon:x:584788:584788::/nonexistent:/bin/false...

También puede utilizar los operadores lógicos && (y), || (o) y ! (no) combinar patrones. Por ejemplo, si desea imprimir líneas del /etc/passwd que tienen un UID mayor que 1000 y un shell distinto de /usr/sbin/nologin , puede 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::/nonexistent:/bin/false snap_daemon:x:584788:584788::/inexistente:/bin/false ...

¿Cómo editar texto con el comando AWK?

dl.beatsnoop.com pulgar 1687289615

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

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

que dan:

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

Puede consultar el manual del comando AWK para conocer otras funciones y variables disponibles.

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

El comando AWK se puede utilizar para realizar bucles for sobre campos o líneas en un archivo. La sintaxis del bucle for es la siguiente:

para acción (variable en matriz)

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

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

Esta 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

que dan:

La primera prueba es Esta gran herramienta. La primera es el sistema operativo AWK. La mejor es Linux.
dl.beatsnoop.com pulgar 1687289757

También puede utilizar el bucle for para recorrer las líneas de un archivo con la FNR , que contiene el número de línea relacionado con el archivo actual. Por ejemplo, si desea imprimir los números de línea pares del test.txt , puede utilizar el siguiente comando:

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

que dan:

2
4

¿Cómo ejecutar un script AWK?

extensión .awk y otorgarle derechos de ejecución con el chmod +x . Luego puede ejecutar el script con el comando ./script_name.awk [archivos] .

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

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

Puede ejecutar el script con el siguiente comando:

./hola.awk

que dan:

Buenos dias

¿Cómo pasar argumentos a un script AWK?

dl.beatsnoop.com pulgar 1687289922

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

  • El primer método es utilizar la -v con el variable=valor . Por ejemplo, si desea pasar dos argumentos llamados var1 y var2 a su hello.awk , puede usar el siguiente comando:
awk -v var1=hola -v var2=mundo -f hola.awk 

Y en su hello.awk puede acceder a los argumentos con las variables $var1 y $var2 . Por ejemplo, si su script contiene:

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

Usted obtiene :

Buen mundo
  • El segundo método consiste en utilizar la ARGV , que contiene los argumentos pasados ​​al script. Por ejemplo, si desea pasar dos argumentos sin nombre a su hello.awk , puede usar el siguiente comando:
awk -f hola.awk hola mundo 

Y en su hello.awk índices ARGV[1] y ARGV[2] . Por ejemplo, si su script contiene:

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

Usted obtiene :

Buen 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 depurar un script AWK?

Para depurar un script AWK, puede usar la -W parámetro lint , que muestra mensajes de advertencia sobre posibles errores en el script. También puede utilizar la -W con el dump-variables , que muestra los valores de las variables al final de la ejecución del script.

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

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

awk -F: '{imprimir $1, $3}' /etc/contraseña | ordenar -n -k2 

Al combinar AWK con otros comandos (aquí ordenar ), puede llegar mucho más lejos en la visualización y organización de datos.

¿Cómo imprimir el recuento de palabras de un archivo con el comando AWK?

Para imprimir el número de palabras en un archivo con 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 la línea actual. Usando un bucle for, puede contar la cantidad de palabras en cada línea y agregarlas a una total . Usando el patrón especial END puedes imprimir el resultado final. Por ejemplo, si tiene un archivo llamado test.txt que contiene:

Esta es una prueba AWK es una gran herramienta Linux es el mejor sistema operativo

Puede imprimir el recuento de palabras del archivo con el siguiente comando:

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

que dan:

9

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

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

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

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

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

que dan:

nombre edad Alice 25 Bob 32 Charles 28

¿Cómo filtrar datos con el comando AWK?

El comando AWK le 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 líneas en el test.csv que contienen el nombre Alice , puede utilizar el siguiente patrón:

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

que dan:

Alicia, Dupont, 25

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

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

que dan:

Bob, Martín, 32

Puede combinar múltiples patrones con los operadores lógicos && (y), || (o) y ! (No). Por ejemplo, si desea mostrar líneas en el test.csv que tienen un nombre que comienza con C o una edad menor a 10 años, puede usar el siguiente patrón:

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

que dan:

CAMILLA,M,7 CLARA,F,11 CLEMENTE,M,7

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

El comando AWK le permite calcular estadísticas sobre datos numéricos en un archivo, como suma, promedio, mínimo o máximo. Para hacer esto, simplemente use variables para almacenar valores intermedios y actualícelos en cada línea. Usando el END , podemos mostrar el resultado final. Por ejemplo, si deseas calcular la suma y el promedio de las edades en el test.csv , puedes utilizar el siguiente programa:

awk -F"," 'NR>1 {suma+=$3; contar++} FINAL {imprimir "Suma: " suma; imprimir 'Promedio: 'suma/recuento}' prueba.csv 

que dan:

Suma: 110 Promedio: 18.3333

Explicaciones:

  • Usamos la -F"," para definir el separador de campo como una coma.
  • Usamos la condición NR>1 para ignorar la primera línea del archivo, que contiene los nombres de las columnas.
  • Usamos las de suma y conteo para acumular la suma y el número de edades. Usamos el += para incrementar las variables con el valor del tercer campo ( $3 ).
  • Usamos el FINAL para mostrar el resultado final. Usamos el / para calcular el promedio dividiendo la suma por el número.

Asimismo, si quieres calcular las edades mínima y máxima del test.csv , puedes utilizar el siguiente programa:

awk -F"," 'NR>1 {if (min=="") min=max=$3; si ($3 max) max=$3} FIN {imprimir "Min: " min; imprimir 'Max: 'max}' prueba.csv 

que dan:

Mín.: 6 Máx.: 32

Explicaciones:

  • Usamos la -F"," para definir el separador de campo como una coma.
  • Usamos la condición NR>1 para ignorar la primera línea del archivo, que contiene los nombres de las columnas.
  • Usamos las 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íos ( "" ). Usamos los < y > para comparar valores y actualizar variables si es necesario.
  • Usamos el FINAL para mostrar el resultado final.

Conclusión

El comando AWK es una herramienta esencial para manipular textos en Linux. Le permite realizar tareas complejas en 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 posibilidades. Por ejemplo, puede utilizar el comando Echo en Windows para mostrar un mensaje o variable en la pantalla. Si quieres aprender más sobre el comando AWK, puedes consultar el manual o los numerosos tutoriales disponibles en Internet.

Artículo anterior ¿Cómo proteger sus transferencias de archivos con FTPS en Windows Server?
Artículo siguiente ¿Cómo obtener YouTube Premium gratis?
Hola, soy François :) Editor en mi tiempo libre al que le encanta compartir su pasión: ¡TT High tech! 😍 Ya sea hardware, software, videojuegos, redes sociales y muchas otras áreas del sitio. Comparto contigo mis análisis, mis pruebas, tutoriales y mis favoritos en varios medios. Soy un tecnófilo conocedor y exigente, que no sólo sigue la moda, sino que busca guiarte hacia las mejores soluciones. ¡Así que estad atentos!