Uso de awk: Herramientas UNIX (V)
Como vimos anteriormente en el uso de cut, awk puede servirnos para el caso que se usen multiples delimitadores seguidos. Pero awk no solo es un “cut avanzado“, es un lenguaje de programación.
Tal como vimos anteriormente awk se puede usar para obtener ciertos campos. Usamos $1 para el primero, $2 el segundo…
$ echo "1 2 3 4 5" | awk '{ print $1,$3,$5 }' 1 3 5
Mediante el parámetro -F podemos definir el separador:
$ echo "1@2@3@4@5" | awk -F @ '{ print $1,$3,$5 }' 1 3 5
Muchas veces el valor que nos interesa es el último, sin importar si es el tercero o el cuarto, para ello se usa $NF:
$ cat /etc/hosts | awk '{ print $NF }' localhost montseny croscat curullons tibidabo saboredo montgrony bonanza
También podemos hacer condicionales fácilmente:
$ echo "10 ejemplo" | awk '$1 >9 { print $2 }' ejemplo $ echo "8 ejemplo" | awk '$1 >9 { print $2 }'
Incluso comparando cadenas:
$ echo "8 ejemplo" | awk '$2 ~ /ejemplo/ { print $1 }' 8 $ echo "8 ejemplo" | awk '$2 ~ /diferente/ { print $1 }'
Pero donde la magia de awk se aprecia es mediante BEGIN y END, estos se ejecutan respectivamente al principio y al final de procesar un fichero. Por ejemplo, mediante seq sacamos la secuencia de números del 1 al 10 y mediante awk los sumamos:
$ seq 1 10 | awk '{ sum+=$1 } END { print sum }' 55
Otro ejemplo sería creando un array para contar los comandos más utilizados en un sistema:
$ history | sed 's/^[^>]*> //' | awk '{ a[$1]++ } END { for (i in a) { print a[i], i } }' | sort -nr 68 cd 63 w 62 ls 56 cat 45 df 35 ps 21 sudo 21 ll 17 mount 14 iostat 11 history 9 dmesg 8 pwd 6 vgdisplay 6 lsmod 6 du 3 vi 3 top 3 perl 3 mysql 3 last 3 free 2 wget 2 pvdisplay 2 less 2 echo 1 wtf 1 tail 1 strace 1 pps 1 moutn 1 mii-tool 1 lvdisplay 1 grep 1 env 1 dig 1 crontab 1 alias
Deja un comentario: