Ejemplo para sumar el tamaño total ocupado por los ficheros de un directorio:
$ ls -l /var/log/httpd | awk ‘{ sum += $5 } END { print sum }’
144491703
Podemos hacer mas flexible la suma de columnas en AWK8 añadiendo una condición, en este ejemplo limitamos la suma del tamaño de los ficheros a aquellos en los que el usuario «apache» sea el propietario del mismo:
$ ls -l /var/log/httpd | awk ‘ $3 == «apache» { sum += $5 } END { print sum }’
2448
Tip! Obtener el tamaño total ocupado por un determinado tipo de ficheros: con find filtramos por el tipo de extensión, con stat obtenemos el tamaño total de cada fichero y finalmente hacemos la suma con AWK8:
# find /var/www/centos.org -iname «*.iso» -exec stat -c %s {} \; | awk ‘{ sum += $1 } END { printf «%d», sum }’
35329271808
Del mismo modo, podemos simular un «grep -c» con AWK8 para contar las veces que aparece un determinado en un patrón, en este ejemplo contamos la veces que aparece el string «Invalid user» en /var/log/secure:
# awk ‘/Invalid user/ { count+=1 } END { print count }’ /var/log/secure
7605
Imprimir un determinado rango de columnas en AWK
Ejemplo para imprimir con AWK un determinado rango de columnas, en este caso se procesa un log de Apache para imprimir únicamente el contenido entre la primera y quinta columna:
$ cat /var/log/apache2/woop.es-access.log | awk ‘{ for (x=1; x<=5; x++) { printf «%s «, $x } printf «\n» }’
Utilizando NF (Number of Fields, número de campos en la línea actual) podemos imprimir el contenido desde una determinada columna hasta el final, en este ejemplo analizamos el log del servicio CRON para imprimir el último campo (que se corresponde al comando ejecutado), posteriormente lo filtramos con sort + uniq para listar de mayor a menor la frecuencia de los crontabs que mas se ejecutan:
$ awk ‘$7 == «CMD» { for (x=8; x<=NF; x++) { printf «%s «, $x } printf «\n» }’ /var/log/cron | sort | uniq -c | sort -nr
Imprimir/extraer el contenido entre dos patrones/caracteres con AWK
Con este sencillo hack para AWK8 podemos imprimir el contenido entre dos determinados patrones; Por ejemplo, vamos a analizar un caso donde nos interesa extraer el contenido que se encuentra entre los caracteres [ y ]:
$ cat example.txt
[noop] anticipatory deadline cfq
noop anticipatory deadline [cfq]
noop anticipatory [prueba
multilinea]
$ awk ‘$0=$2’ FS=[ RS=] example.txt
noop
cfq
prueba
multilinea
* Establecemos la variable FS (Field Separator, o separador de campos, similar al IFS de BASH8) al valor [. Es decir, FS contiene el primer patrón.
* Al utilizar [ como FS tendremos el contenido separado en X partes: la variable $1 contendrá lo que se queda a la «izquierda» del patrón, $2 contiene lo que queda a la derecha, y así sucesivamente. Con la asignación $0=$2 la línea completa pasa a tener el valor que está a la «derecha» del patrón que hemos utilizado como FS.
* Utilizamos RS=[ (Input Record Separator) para marcar el final del contenido que buscamos, así cuando AWK8 se encuentra con el patrón ] lo toma como el final del contenido, es decir, RS contiene el segundo patrón.
En este otro ejemplo, vamos a extraer las cadenas que se encuentran entre las etiquetas HTML <a href=» y «> de la página de un usuario del servicio , de modo que obtendremos un listado de enlaces que este ha publicado:
$ curl -s -o – http://www.Syswoody.com | awk -v FS='<a href=»‘ -v RS='»>’ ‘$0=$2’
http://tr.im/D9JQ
http://tr.im/Cduv
http://tr.im/BHg9
http://tr.im/BCIu
http://tr.im/AdYR
(.