Uso del comando awk en linux

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

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ónSu uso
-F / fsEspecificar el separador de archivos
-f / fileIndicar el archivo con el script awk
-v / var=valueDeclarar 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

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 titulos con el comando awk

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.

VariableUso
FIELDWIDTHSPermite especificar el ancho del campo
RSPermite especificar el separador de campos
FSPermite especificar un separador de campos
ORSPermite especificar el separador de salida
OFSPermite 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

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

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.

Chat de SoloLinux en Telegram

 

Agregar comentario

1 logo sololinux

Suscríbete a SoloLinux

Recibe todos los nuevos artículos es tu correo electrónico

You have Successfully Subscribed!

Ir al contenido