Uso del comando awk en linux, con ejemplos.
El comando awk, ofrece un tipo de lenguaje de programación específico para procesar texto o caracteres. Usado ampliamente para manipular datos y generar informes, el comando awk no requiere compilación. Destacamos que se permite el uso de variables, también funciones numéricas, funciones de cadena y operadores lógicos.
En definitiva, el comando awk es un lenguaje de secuencias de comandos muy poderoso, con el cual puedes…
- Definir variables
- Usar cadenas y operadores aritméticos
- Hacer uso de control de flujo y ciclos
- Generar reportes con formato
En este artículo, haremos una pequeña introducción en el mundo de awk.
Comando awk
Uso del comando awk en linux
La sintaxis del comando AWK es un poco diferente si la comparamos con los comandos habituales, aun así, no es tan difícil como parece en un principio.
awk [options] [program] [file]
Estas son las opciones:
Opción | Su uso |
---|---|
-F / fs | Especificar el separador de archivos |
-f / file | Indicar el archivo con el script awk |
-v / var=value | Declarar una variable |
Leer un script awk
Para definir un script awk, debes incluirlo entre comillas dobles que a su vez (el conjunto), estará entre comillas simples. Como ejemplo imprimimos un texto.
awk '{print "Bienvenido a SoloLinux "}'
Para salir del modo programación, pulsa las teclas «Ctrl + d». Vemos un ejemplo del resultado.
sergio@sololinux:~$ awk '{print "Bienvenido a SoloLinux "}' Bienvenido a SoloLinux Bienvenido a SoloLinux sergio@sololinux:~$
Usar variables en awk
Agregar variables para extraer campos de un archivo de texto es tarea sencilla. Por ejemplo…
- $0 – Todos los campos de la línea.
- $1 – El primer campo.
- $2 – El segundo campo.
- $3 – El tercer campo.
Tenemos un archivo de texto denominado «demo.txt», con este contenido.
Yo uso Arch Linux Yo uso Debian Yo uso Alpine Yo uso Slackware
A modo de ejemplo, vemos el resultado de las cuatro variables anteriores.
sergio@sololinux:~$ awk '{print $0}' demo.txt Yo uso Arch Linux Yo uso Debian Yo uso Alpine Yo uso Slackware sergio@sololinux:~$ awk '{print $1}' demo.txt Yo Yo Yo Yo sergio@sololinux:~$ awk '{print $2}' demo.txt uso uso uso uso sergio@sololinux:~$ awk '{print $3}' demo.txt Arch Debian Alpine Slackware
Si observas detenidamente el ejemplo anterior, los espacios en blanco o tabulaciones son los separadores por defecto de awk. Entonces… ¿Qué sucede cuando los separadores por defectos son otros caracteres?. Vemos un ejemplo claro en «/etc/passwd«.
cat /etc/passwd
En este caso, los campos están delimitados por dos puntos «:».
Separadores en /etc/passwd
Forzamos el separador correspondiente con «-F:» (no olvides la variable).
awk -F: '{print $1}' /etc/passwd
Ejemplo de salida.
sergio@sololinux:~$ awk -F: '{print $1}' /etc/passwd root daemon bin sys sync games man lp mail news uucp proxy www-data backup
Uso de varios comandos a la vez
Puedes agregar varios comandos a la vez. Nosotros ejecutamos el comando echo con dos campos, a continuación… con awk y su variable sustituimos el segundo campo del comando echo, por el campo insertado en awk, e imprimimos el resultado total. Soy consciente que puede parecer un poco lioso, pero te aseguro que no lo es.
echo "Hola Sergio" | awk '{$2="SoloLinux"; print $0}'
Obtenemos el siguiente resultado.
sergio@sololinux:~$ echo "Hola Sergio" | awk '{$2="SoloLinux"; print $0}' Hola SoloLinux sergio@sololinux:~$
Pre-procesar con awk
Con esta acción podemos crear títulos a la hora de imprimir archivos. Nos ayudamos de «BEGIN» y del archivo demo.txt que creamos anteriormente.
awk 'BEGIN {print "Que linux usas:"} > {print $0}' demo.txt
Ahora se imprime el título y, el texto del archivo.
Insertar títulos con el comando awk
Variables integradas
Junto al separador FS, anteriormente vimos las variables de campo para extraer datos, $1, $2, $3, etc. Debes saber que no son las únicas, también tenemos a nuestra disposición otras variables integradas, las más comunes son las de la siguiente tabla.
Variable | Uso |
---|---|
FIELDWIDTHS | Permite especificar el ancho del campo |
RS | Permite especificar el separador de campos |
FS | Permite especificar un separador de campos |
ORS | Permite especificar el separador de salida |
OFS | Permite especificar un separador de salida |
De forma predeterminada, la variable OFS equivale al espacio, haciendo uso de ella puedes seleccionar el separador que tú quieras. Vemos un ejemplo.
awk 'BEGIN{FS=":"; OFS="-"} {print $1,$2,$3,$4,$5}' /etc/passwd
Verás en tu pantalla algo similar a…
sergio@sololinux:~$ awk 'BEGIN{FS=":"; OFS="-"} {print $1,$2,$3,$4,$5}' /etc/passwd root-x-0-0-root daemon-x-1-1-daemon bin-x-2-2-bin sys-x-3-3-sys sync-x-4-65534-sync games-x-5-60-games man-x-6-12-man lp-x-7-7-lp mail-x-8-8-mail news-x-9-9-news
En el caso de que existan varios tipos de separadores podemos usar la variable FIELDWIDTHS, que además nos ayudara a delimitar el tamaño de los campos, en el caso que sean desiguales.
awk 'BEGIN{FIELDWIDTHS="3 4 3"}{print $1,$2,$3}' demo.txt
Ejemplo…
sergio@sololinux:~$ awk 'BEGIN{FIELDWIDTHS="3 4 3"}{print $1,$2,$3}' demo.txt Yo uso Arc Yo uso Deb Yo uso Alp Yo uso Sla sergio@sololinux:~$
Comandos estructurados
Una de las particularidades del comando awk, es su lenguaje de scripting que por ejemplo incluye soporte para sentencias condicionales if. Supongamos que tenemos un archivo con el siguiente contenido.
9 180 3 27 49 31
Ahora imprimimos los números con valor superior a 25.
awk '{if ($1 > 25) print $1}' demo1.txt
Como podemos ver en la imagen inferior, el resultado es correcto.
Sentencias condicionales con el comando awk
Usamos llaves para ejecutar varias sentencias.
awk '{ > > if ($1 > 25) > > { > > x = $1 * 3 > > print x > > } > > }' demo1.txt
Resultado….
sergio@sololinux:~$ awk '{ > > if ($1 > 25) > > { > > x = $1 * 3 > > print x > > } > > }' demo1.txt 540 81 147 93 sergio@sololinux:~$
También agregamos una «else».
awk '{ > > if ($1 > 25) > > { > > x = $1 * 3 > > print x > > } else > > { > > x = $1 / 2 > > print x > > }}' demo1.txt
Obtenemos el siguiente resultado.
sergio@sololinux:~$ awk '{ > > if ($1 > 25) > > { > > x = $1 * 3 > > print x > > } else > > { > > x = $1 / 2 > > print x > > }}' demo1.txt 4.5 0 540 0 1.5 0 81 0 147 0 93 sergio@sololinux:~$
Bucle While
El bucle While, es un ciclo repetitivo basado en los resultados de una expresión lógica. Puedes usarlo para iterar sobre los datos con una condición.
awk '{ > > sum = 0 > > i = 1 > > while (i < 8) > > { > > sum += $i > > i++ > > } > > average = sum / 4 > > print "Average:",average > > }' demo1.txt
Imagen de ejemplo.
Ciclo while con el comando awk
Bucle For
También se admiten sentencias de bucles for.
awk '{ > > total = 0 > > for (var = 1; var < 8; var++) > > { > > total += $var > > } > > avg = total / 4 > > print "Average:",avg > > }' demo1.txt
Funciones Matemáticas
Se permite el uso de las siguientes funciones matemáticas:
- sin(x)
- cos(x)
- sqrt(x)
- exp(x)
- log(x)
- rand()
Un ejemplo.
awk 'BEGIN{x=cos(10); print x}'
Salida…
sergio@sololinux:~$ awk 'BEGIN{x=cos(10); print x}' -0.839072
Funciones String
Tienes a tu disposición muchas funciones string (de cadena de caracteres), en nuestro caso usaremos «toupper», que convierte el texto a texto en mayúsculas.
awk 'BEGIN{x = "sololinux"; print toupper(x)}'
Obtenemos la palabra sololinux en mayúsculas.
sergio@sololinux:~$ awk 'BEGIN{x = "sololinux"; print toupper(x)}' SOLOLINUX sergio@sololinux:~$
Dar formato a la salida
Como último apunte de este artículo, vemos como dar formato a la salida del comando awk. La sintaxis es sencilla.
%[formato]control-letter
Normalmente, el formato se aplica a «printf». Estas son las opciones más comunes.
- c – Se imprimen las salidas numéricas como cadena de caracteres.
- d – Valores enteros.
- e – Se imprime numeración científica.
- f – Valores numéricos incluyendo los decimales.
- o – Los valores se imprimen en octal.
- s – Imprime cadenas de texto.
En nuestro ejemplo necesitamos los decimales.
awk 'BEGIN{ > > x = 123 / 89 > > printf "El resultado es: %f\n", x > > }'
Obtenemos el resultado deseado.
sergio@sololinux:~$ awk 'BEGIN{ > > x = 123 / 89 > > printf "El resultado es: %f\n", x > > }' El resultado es: 1.382022 sergio@sololinux:~$
Canales de Telegram: Canal SoloLinux – Canal SoloWordpress
Espero que este artículo te sea de utilidad, puedes ayudarnos a mantener el servidor con una donación (paypal), o también colaborar con el simple gesto de compartir nuestros artículos en tu sitio web, blog, foro o redes sociales. Uso del comando awk en linux.