systemadmin.es > Utilidades > Uso de awk: Herramientas UNIX (V)

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:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>