Página 1 de 1

Problema con Perl y Awk

NotaPublicado: 2007-01-30 14:21 @640
por Guille
Hola a todos, hace mucho que no posteo pero es que tengo un problema y seguramente me puedan ayudar el problema es que no he podido escapar las comillas de awk en un sentencia, he buscado ya en el foro pero no esta de la manera que necesito, esto es lo que deseo hacer:

En terminal devuelve el valor correcto al ejecutarse:

root@maquina1 [~]# df /dev/sdc | grep /dev/ | awk '{ print $5 }'

Pero dentro de un script de la siguiente manera;

$capacidad= `df /dev/sdc | grep /dev/ | awk '{ print $5 }'`;

No funciona la parte del awk, que intentado escapar las comillas con una barra pero no ha funcionando

alguna sugerencia ??

Gracias como siempreee!!!!

Guille :D

NotaPublicado: 2007-01-30 18:04 @794
por explorer
El problema está en el '$'. Perl piensa que forma parte de alguna variable, así que intenta sacar el valor de la variable '$5'.

Solución: escapar.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$capacidad = `df /dev/sdc | grep /dev |awk '{print \$5}'`;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

pero... ¿por qué llamar a los comandos grep y awk, cuando podemos hacerlo todo en Perl?
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$capacidad = (split " ",( qx(df /dev/sdc))[1] )[4];
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Ejecutamos el comando 'df' y nos quedamos con la segunda línea ([1]) del resultado, que dividiremos por los espacios en blanco con split y nos quedaremos sólo con el quinto campo ([4]).

Fíjate que usamos split de la misma manera que usamos el awk, para obtener campos separados por espacios.

Al final, nos ahorramos la ejecución de un par de comandos del sistema, que a veces puede marcar la diferencia.

Como estamos en el foro básico, una solución más larga y entendible sería:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
@capacidad = `df /dev/sdc`;
$capacidad = ( grep { /dev/ } @capacidad )[0];
$capacidad = ( split     " ", $capacidad )[4];

print $capacidad;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

y la solución más elaborada y cómoda, con un módulo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use Filesys::Df;
print df("/tmp")->{per};    # Pinta el porcentaje de ocupación en /tmp
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

(solución cómoda porque Filesys::Df llama a una función del sistema, por lo que nos ahorramos ejecutar el comando 'df').

NotaPublicado: 2007-01-31 11:03 @502
por Perl user
No entiendo por qué usar Perl de esa forma.

Perl es grep y awk en uno solo. Recuerden que los pipes redireccionan a otro proceso.... así que es mas eficiente solo ejecutar el df, y hacer todo el filtrado y procesamiento desde Perl.

Tienes dos opciones para obtener los datos de df, utilizando backticks como lo has hecho o utilizando open en su modalidad de pipe.

Lo demás es solo procesamiento por medio de Perl.

Saludos,