jueves, 13 de diciembre de 2007

Comando awk

Fuente: LinuTeca

Awk es un lenguaje de búsqueda y procesamiento de patrones. Esto quiere decir que podemos tratar archivos buscando patrones y realizar operaciones matemáticas con los resultados. A simple vista puede resultar parecido con el comando grep o egrep, pero lo cierto esque la potencia del comando awk les supera con creces.

En un caso particular, este comando me ayudó mucho porque era incapaz de obtener el resultado deseado con egrep, a continuación expongo el caso:

Mi intención era obtener la temperatura del microprocesador para que a través de un script, pueda aumentar o disminuir la velocidad de los ventiladores.

Al ejecutar el comando ’sensors’(hay que tener instalado el lm-sensors me devolvía lo siguiente:

ekhtor@macbook:~$ sensors

applesmc-isa-0300

Adapter: ISA adapter

temp2: +128°C

temp3: +56°C

temp4: +51°C

temp8: +51°C

temp9: +52°C

temp11: +42°C

Exhaust :3000 RPM (safe = 1200 RPM, min = 3000 RPM, max = 6200 RPM)coretemp-isa-0000

Adapter: ISA adapter

Core 0: +47°C (high = +100°C)

coretemp-isa-0001

Adapter: ISA adapter

Core 1: +46°C (high = +100°C)

El patrón que elegí fue ‘0:’ para obtener la línea ‘Core 0: +47°C (high = +100°C)’ con el comando egrep:

ekhtor@macbook:~$ sensors |egrep 0:

Core 0: +46°C (high = +100°C)

Lo siguiente que se me ocurrió fue usar el comando cut para dejar al principio de la linea la temperatura:

ekhtor@macbook:~$ sensors | egrep 0: | cut -d+ -f2

46°C (high = +

Y el problema surge aqui, cuando intento ejecutar de nuevo el comando cut para coger el primer campo y usando el patrón ‘º’ veo que no es admitido y se me ocurrieron muchas formas de hacerlo truncando la línea pero no me parecía demasiado óptimo asique lo solucioné con la suiguiente instrucción:

ekhtor@macbook:~$ sensors | egrep 0: | cut -d+ -f2 | awk ‘BEGIN{FS = "°"}{print $1}’

46

Ahora si obtuve el resultado deseado, ya podía trabajar con la temperatura normalmente.

El funcionamiento de awk básico es muy sencillo, la separación por defecto de las columnas de un archivo la realiza a través de un espacio. Para cambiar ese patrón, solo cambié la variable FS, y con el print mostramos por pantalla las columnas que queremos, la $0 muestra la línea entera, la $1 la primera columna, $2 la segunda y sucesivamente…

En el caso de que quisieramos mostrar la primera y segunda columna del archivo ‘ejemplo.txt’ el comando sería:

awk ‘{print $1 $2}’ ejemplo.txt

Para más información acerca del comando en la sección de manuales encontraréis documentación más completa.

No hay comentarios: