AWK: Extrayendo datos del output de los comandos de la consola

estoy aprendiendo AWK :D (o al menos, lo añadí a la interminable lista de cosas que tengo que saber antes de morir XD). Parece interesante, sirve para extraer datos, y se puede usar para extraer datos mediante los comandos de Linux…

Aquí una probadita:
ls -l | awk -v size=$1 '{ if ($5 >= size) print $9}'

muestra todos los archivos mayores a un tamaño que se le envía como parámetro al script.

El funcionamiento es bonito y sencillo de entender ^w^

Cada línea del ls se le envía al awk como un conjunto de “parámetros”, por eso, no podemos usar los parámetros que se le envíen a nuestro script por consola dentro del awk, sencillamente con un “$1”!!. Para solucionarlo, le digo al awk, explícitamente, que la variable “size” tendrá el valor del primer parámetro que se le envíe a mi script. Eso lo hago con -v (que aún no sé para qué sirve XD yo también estoy aprendiendo…).

Awk parte la línea en columnas, y cada columna es enviada a awk como un parámetro. En este caso, ls -l tiene 9 columnas, por lo que, cada vez que comienza una nueva línea en ls, es como si le enviaramos 9 parámetros:


$1.........$2.$3.$4..$5.....$6..$7.$8....$9
-rw-r--r-- 1 vg vg 733817 Jun 24 10:08 ch08.pdf

el 5to parámetro, que contiene el tamaño de los archivos. Así que, dentro del comando awk, la usamos como si fuera una variable: “if ($5 >= size)”.

Luego, si la condición se cumple, imprime el parámetro $9, que es el nombre del archivo.

Edit: el -v solo sirve para declarar variables antes de entrar al código de awk XD
awk --help | awk '{ if(index($1, "-v")) print $0}'
(sí, sé que es más fácil con | grep -v pero quería hacerlo con awk, solo for the lulz

Advertisements