El comando awk es una herramienta y lenguaje de programación de Linux que permite a los usuarios procesar y manipular datos y producir informes formateados. La herramienta admite varias operaciones para el procesamiento avanzado de texto y facilita la expresión de selecciones de datos complejas.
En este tutorial, aprenderás qué hace el comando awk y cómo usarlo.
Sintaxis del comando AWK
La sintaxis del comando awk es:
awk [opciones] 'criterio_de_selección {acción}' archivo-de-entrada > archivo-de-salida
Las opciones disponibles son:
Opción | Descripción |
---|---|
-F [separador] | Se usa para especificar un separador de archivos. El separador predeterminado es un espacio en blanco. |
-f [nombre-de-archivo] | Se usa para especificar el archivo que contiene el script awk. Lee la fuente del programa awk desde el archivo especificado, en lugar del primer argumento de la línea de comandos. |
-v | Se usa para asignar una variable. |
Nota: También podrías estar interesado en aprender sobre el comando curl de Linux, que te permite transferir datos hacia y desde un servidor después de procesarlos con awk.
¿Cómo funciona el comando AWK?
El propósito principal del comando awk es facilitar la recuperación de información y la manipulación de texto en Linux. Este comando de Linux funciona escaneando un conjunto de líneas de entrada en orden y buscando líneas que coincidan con los patrones especificados por el usuario.
Para cada patrón, los usuarios pueden especificar una acción que se realizará en cada línea que coincida con el patrón especificado. Por lo tanto, usando awk, los usuarios pueden procesar fácilmente archivos de registro complejos y generar un informe legible.
Nota: El comando awk recibió su nombre de tres personas que escribieron la versión original en 1977: Alfred Aho, Peter Weinberger y Brian Kernighan.
Operaciones AWK
awk permite a los usuarios realizar varias operaciones en un archivo de entrada o texto. Algunas de las operaciones disponibles son:
- Escanear un archivo línea por línea.
- Dividir la línea/archivo de entrada en campos.
- Comparar la línea o los campos de entrada con el/los patrón(es) especificado(s).
- Realizar varias acciones en las líneas coincidentes.
- Dar formato a las líneas de salida.
- Realizar operaciones aritméticas y de cadenas.
- Usar flujo de control y bucles en la salida.
- Transformar los archivos y los datos de acuerdo con una estructura especificada.
- Generar informes formateados.
Sentencias AWK
El comando proporciona sentencias básicas de flujo de control (if-else, while, for, break) y también permite a los usuarios agrupar sentencias usando llaves {}
.
if-else
La sentencia if-else funciona evaluando la condición especificada entre paréntesis y, si la condición es verdadera, se ejecuta la sentencia que sigue a la sentencia if. La parte else es opcional.
Por ejemplo:
awk -F ',' '{if($2==$3){print $1","$2","$3} else {print "Sin Duplicados"}}' respuestas.txt
Contenido del archivo respuestas.txt
:
a,1,1
b,3,4
c,5,2
d,6,1
e,3,3
f,3,7
Resultado:
a,1,1
Sin Duplicados
Sin Duplicados
Sin Duplicados
e,3,3
Sin Duplicados
Uso de la sentencia if-else en awk. La salida muestra las líneas en las que existen duplicados y dice “Sin Duplicados” si no hay respuestas duplicadas en la línea.
while
La sentencia while ejecuta repetidamente una sentencia objetivo mientras la condición especificada sea verdadera. Eso significa que funciona como la de (lenguaje de programación) C. Si la condición es verdadera, se ejecuta el cuerpo del bucle. Si la condición es falsa, awk continúa con la ejecución.
Por ejemplo, la siguiente sentencia indica a awk que imprima todos los campos de entrada, uno por línea:
awk '{i=0; while(i<=NF) { print i ":"$i; i++;}}' empleados.txt
0:María López cajera $500
1:María
2:López
3:cajera
4:$500
0:Juan Pérez vendedor $700
1:Juan
2:Pérez
3:vendedor
4:$700
for
La sentencia for también funciona como la de C, permitiendo a los usuarios crear un bucle que necesita ejecutarse un número específico de veces.
Por ejemplo:
awk 'BEGIN{for(i=1; i<=10; i++) print "El cuadrado de", i, "es", i*i;}'
El cuadrado de 1 es 1
El cuadrado de 2 es 4
El cuadrado de 3 es 9
El cuadrado de 4 es 16
El cuadrado de 5 es 25
El cuadrado de 6 es 36
El cuadrado de 7 es 49
El cuadrado de 8 es 64
El cuadrado de 9 es 81
El cuadrado de 10 es 100
Un ejemplo de la sentencia for en awk. La sentencia anterior incrementa el valor de i
en uno hasta que llega a diez y calcula el cuadrado de i
cada vez.
Nota: Las expresiones en la parte de condición de if, while o for pueden incluir operadores relacionales, como
<
,<=
,>
,>=
,==
(es igual a) y!=
(no es igual a). Las expresiones también pueden incluir coincidencias de expresiones regulares con los operadores~
y!~
, operadores lógicos||
,&&
y!
. Los operadores se agrupan con paréntesis.
break
La sentencia break sale inmediatamente de un while o for que lo engloba. Para comenzar la siguiente iteración, usa la sentencia continue.
La sentencia next indica a awk que salte al siguiente registro y comience a buscar patrones desde arriba. La sentencia exit indica a awk que la entrada ha terminado.
A continuación, se muestra un ejemplo de la sentencia break:
awk 'BEGIN{x=1; while(1) {print "Ejemplo"; if ( x==5 ) break; x++; }}'
Ejemplo
Ejemplo
Ejemplo
Ejemplo
Ejemplo
Uso de la sentencia break en awk. El comando anterior interrumpe el bucle después de 5 iteraciones.
Nota: La herramienta awk permite a los usuarios colocar comentarios en los programas AWK. Los comentarios comienzan con
#
y terminan al final de la línea.
Patrones AWK
Insertar un patrón delante de una acción en awk actúa como un selector. El selector determina si realizar una acción o no. Las siguientes expresiones pueden servir como patrones:
- Expresiones regulares.
- Expresiones relacionales aritméticas.
- Expresiones con valores de cadena.
- Combinaciones booleanas arbitrarias de las expresiones anteriores.
Las siguientes secciones explican las expresiones mencionadas anteriormente y cómo usarlas.
Nota: Aprende cómo puedes buscar cadenas o patrones con el comando grep.
Patrones de expresiones regulares
Los patrones de expresiones regulares son la forma más simple de expresiones que contienen una cadena de caracteres entre barras. Puede ser una secuencia de letras, números o una combinación de ambos.
En el siguiente ejemplo, el programa imprime todas las líneas que comienzan con “A”. Si la cadena especificada es parte de una palabra más grande, también se imprime.
awk '$1 ~ /^A/ {print $0}' empleados.txt
Ana Gómez cajera $600
Alicia Martínez directora $450
Patrones de expresiones relacionales
Otro tipo de patrones awk son los patrones de expresiones relacionales. Los patrones de expresiones relacionales implican el uso de cualquiera de los siguientes operadores relacionales: <
, <=
, ==
, !=
, >=
y >
.
A continuación, se muestra un ejemplo de una expresión relacional awk:
awk 'BEGIN { a = 10; b = 10; if (a == b) print "a == b" }'
Patrones de rango
Un patrón de rango es un patrón que consta de dos patrones separados por una coma. Los patrones de rango realizan la acción especificada para cada línea entre la ocurrencia del patrón uno y el patrón dos.
Por ejemplo:
awk '/secretaria/, /gerente/ {print $1, $2}' empleados.txt
Ana Gómez
Carlos Ruiz
María López
Pedro Sánchez
Lucía Martínez
Juan Pérez
Ejemplo de un patrón de rango. El patrón anterior indica a awk que imprima todas las líneas de la entrada que contienen las palabras clave “secretaria” y “gerente”.
Patrones de expresiones especiales
Los patrones de expresiones especiales incluyen BEGIN y END, que denotan la inicialización del programa y el final. El patrón BEGIN coincide con el comienzo de la entrada, antes de que se procese el primer registro. El patrón END coincide con el final de la entrada, después de que se haya procesado el último registro.
Por ejemplo, puedes indicar a awk que muestre un mensaje al principio y al final del proceso:
awk 'BEGIN { print "Lista de deudores:" }; {print $1, $2}; END {print "Fin de la lista de deudores"}' deudores.txt
Lista de deudores:
deudores.txt
Ana 1500
Pedro 500
Maria 2000
Luis 750
Sofía 1000
Carlos 0
Fin de la lista de deudores
Combinando patrones
El comando awk permite a los usuarios combinar dos o más patrones usando operadores lógicos. Los patrones combinados pueden ser cualquier combinación booleana de patrones. Los operadores lógicos para combinar patrones son:
||
(o)&&
(y)!
(no)
Por ejemplo:
awk '$3 > 10 && $4 < 20 {print $1, $2}' empleados.txt
Ana López
Juan Pérez
María García
Pedro Ruiz
Ejemplo de un patrón combinado en awk. La salida imprime el primer y segundo campo de aquellos registros cuyo tercer campo es mayor que diez y el cuarto campo es menor que 20. empleados.txt
es un ejemplo de nombre de archivo.
Variables AWK
El comando awk
tiene variables de campo incorporadas, que dividen el archivo de entrada en partes separadas llamadas campos. awk asigna las siguientes variables a cada campo de datos:
$0
. Se usa para especificar toda la línea.$1
. Especifica el primer campo.$2
. Especifica el segundo campo.- etc.
Otras variables awk integradas disponibles son:
NR
. Cuenta el número de registros de entrada (generalmente líneas). El comando awk realiza las sentencias patrón/acción una vez por cada registro en un archivo.
Por ejemplo:
awk '{print NR,$0}' empleados.txt
1 Número Apellido Puesto Saldo
2 Ana Pájarro Secretaria €654
3 Weston Bradley Empleado €789
4 Anaya Arroz Directora €1334
5 Andre Wilkins Empleado €446
6 Ian Norris Higiene €655
7 Omar Landry Contador €465
8 Harley Edwards Secretaria €4563
9 María Nieve Gerente €4566
10 Haylee Sweeney CEO €12334
11 Isis Ware Gerente €4566
12 Jaelyn Khan Investigadora €789
13 Julio Estrada Escritor €7988
14 Allen Thomas TI €7854
15 Isaías Hester Desarrollo €4446
16 Jan Harper RRPP €7896
17 Zachery Richard RRHH €7896
18 Zara Brennan Centro de Llamadas €4563
19 Drew Holden Centro de Llamadas €4561
20 Kyra Krause Centro de Llamadas €1345
Ejemplo de la variable NR en awk. El comando muestra el número de línea en la salida. empleados.txt
es un ejemplo de nombre de archivo; puedes usar el que desees.
NF
. Cuenta el número de campos en el registro de entrada actual y muestra el último campo del archivo.
Por ejemplo:
awk '{print $NF}' empleados.txt
Saldo
€654
€789
€1334
€446
€655
€465
€4563
€4566
€12334
€4566
€789
€7988
€7854
€4446
€7896
€7896
€4563
€4561
€1345
FS
. Contiene el carácter utilizado para dividir los campos en la línea de entrada. El separador predeterminado es el espacio, pero puedes usar FS para reasignar el separador a otro carácter (típicamente en BEGIN).
Por ejemplo, puedes hacer que el archivo /etc/passwd
(lista de usuarios) sea más legible cambiando el separador de dos puntos (:
) a un guion (/
) e imprimiendo también el separador de campos:
awk -F: 'BEGIN{FS=":"; OFS="-"} {print $0}' /etc/passwd
root-x-0-0-0-root-/root-/bin/bash
daemon-x-1-1-daemon-/usr/sbin-/usr/sbin/nologin
bin-x-2-2-bin-/bin-/usr/sbin/nologin
sys-x-3-3-sys-/dev-/usr/sbin/nologin
sync-x-4-65534-sync-/bin-/bin/sync
games-x-5-60-games-/usr/games-/usr/sbin/nologin
man-x-6-12-man-/var/cache/man-/usr/sbin/nologin
lp-x-7-7-lp-/var/spool/lpd-/usr/sbin/nologin
mail-x-8-8-mail-/var/mail-/usr/sbin/nologin
news-x-9-9-news-/var/spool/news-/usr/sbin/nologin
uucp-x-10-10-uucp-/var/spool/uucp-/usr/sbin/nologin
proxy-x-13-13-proxy-/bin-/usr/sbin/nologin
Un ejemplo de la variable FS en awk.
RS
. Almacena el carácter separador de registro actual. La línea de entrada predeterminada es el registro de entrada, lo que hace que una nueva línea sea el separador de registro predeterminado. El comando es útil si la entrada es un archivo separado por comas (CSV).
Por ejemplo:
cat ./deudores.txt
Primero-6600,Segundo-450,Tercero-4650,Cuarto-4560,Quinto-4650,Sexto-1100,Séptimo-33300,Octavo-480,Noveno-750,Décimo-2740
awk 'BEGIN {FS="-"; RS=","; OFS=" debe € "} {print $1,$2}' deudores.txt
Primero debe € 6600
Segundo debe € 450
Tercero debe € 4650
Cuarto debe € 4560
Quinto debe € 4650
Sexto debe € 1100
Séptimo debe € 33300
Octavo debe € 480
Noveno debe € 750
Décimo debe € 2740
Nota: Primero usamos el comando cat para mostrar el contenido del archivo y luego formateamos la salida con AWK.
OFS
. Almacena el separador de campo de salida, que separa los campos cuando se imprimen. El separador predeterminado es un espacio en blanco. Siempre que el archivo impreso tenga varios parámetros separados por comas, el valor OFS se imprime entre cada parámetro.
Por ejemplo:
awk 'OFS=" trabaja como " {print $1,$3}' empleados.txt
Ana trabaja como Gerente
Pedro trabaja como Contador
Maria trabaja como Analista
Luis trabaja como Desarrollador
Sofia trabaja como Ingeniera
Carlos trabaja como Asistente
Elena trabaja como Consultora
Javier trabaja como Programador
Inés trabaja como Diseñadora
David trabaja como Ejecutivo
Acciones AWK
La herramienta awk sigue reglas que contienen pares patrón-acción. Las acciones consisten en sentencias encerradas entre llaves {}
que contienen expresiones, sentencias de control, sentencias compuestas, sentencias de entrada y salida, y sentencias de eliminación. Estas sentencias se describen en las secciones anteriores.
Crea un script awk usando la siguiente sintaxis:
awk '{acción}'
Por ejemplo:
awk '{print "Cómo usar el comando awk"}'
Cómo usar el comando awk
Cómo usar el comando awk
Cómo usar el comando awk
...
Un ejemplo de una acción awk. Este sencillo comando indica a awk que imprima la cadena especificada cada vez que ejecutes el comando. Termina el programa usando Ctrl+D.
Cómo usar el comando AWK – Ejemplos
Además de manipular datos y producir salidas formateadas, awk tiene otros usos, ya que es un lenguaje de scripting y no solo un comando de procesamiento de texto. Esta sección explica casos de uso alternativos para awk.
- Cálculos. El comando awk te permite realizar cálculos aritméticos. Por ejemplo:
df | awk '/\/dev\/loop/ {print $1"\t"$2 + $3}'
/dev/loop0 300000
/dev/loop1 200000
/dev/loop2 150000
/dev/loop3 50000
/dev/loop4 1000000
/dev/loop5 750000
Un ejemplo del uso de awk para realizar cálculos aritméticos. En este ejemplo, usamos el comando df
y la información generada en el informe para calcular la memoria total disponible y utilizada por los sistemas de archivos montados que contienen solo /dev
y /loop
en el nombre.
El informe producido muestra la suma de memoria de los sistemas de archivos /dev
y /loop
en las columnas dos y tres de la salida de df
.
- Filtrado. El comando awk te permite filtrar la salida limitando la longitud de las líneas. Por ejemplo:
awk 'length($0) > 8' /etc/shells
/usr/bin/bash
/usr/bin/rbash
/usr/bin/dash
Un ejemplo del uso de awk para filtrar la salida de un comando. En este ejemplo, ejecutamos el archivo del sistema /etc/shells
a través de awk y filtramos la salida para que contenga solo las líneas que contienen más de 8 caracteres.
- Monitoreo. Verifica si un cierto proceso se está ejecutando en Linux usando el comando
ps
. Por ejemplo:
ps -ef | awk '{ if($NF == "clipboard") print $0}'
usuario 2386 1 0 19:58 ? 00:00:00 /usr/bin/VBoxClient -clipboard
usuario 2388 2386 0 19:58 ? 00:00:00 /usr/bin/VBoxClient -clipboard
Un ejemplo del uso de awk para verificar los procesos en ejecución. La salida imprime una lista de todos los procesos que se ejecutan en tu máquina con el último campo que coincide con el patrón especificado.
- Conteo. Puedes usar awk para contar el número de caracteres en una línea y obtener el número impreso en el resultado. Por ejemplo:
awk '{ print "El número de caracteres en la línea", NR,"=" length($0) }' empleados.txt
Número de caracteres en la línea 1 = 25
Número de caracteres en la línea 2 = 30
Número de caracteres en la línea 3 = 28
Número de caracteres en la línea 4 = 22
Número de caracteres en la línea 5 = 35
Número de caracteres en la línea 6 = 27
Número de caracteres en la línea 7 = 31
Número de caracteres en la línea 8 = 24
Número de caracteres en la línea 9 = 29
Número de caracteres en la línea 10 = 33
Número de caracteres en la línea 11 = 26
Número de caracteres en la línea 12 = 31
Nota: Lee también sobre el comando gawk, una herramienta de procesamiento de texto y manipulación de datos.
Conclusión
Después de leer este tutorial, sabes qué es el comando awk
y cómo puedes usarlo eficazmente para varios casos de uso.
El comando awk
también es un lenguaje de scripting con muchos usos, y es un conocimiento esencial para cada usuario de Linux. Úsalo para manipulaciones de texto potentes, pero también como lenguaje de scripting.
¿Qué te parece?
Es bueno conocer tu opinión. Deja un comentario.