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 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?
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?
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?
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.
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?
Para pasar argumentos a un script AWK, puede utilizar dos métodos:
- El primer método es utilizar la
-v
con elvariable=valor
. Por ejemplo, si desea pasar dos argumentos llamadosvar1
yvar2
a suhello.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 suhello.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
yconteo
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
ymax
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.