• Publicidad

Problema con Perl y Awk

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Problema con Perl y Awk

Notapor Guille » 2007-01-30 14:21 @640

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
Avatar de Usuario
Guille
Perlero nuevo
Perlero nuevo
 
Mensajes: 33
Registrado: 2006-05-31 13:30 @604
Ubicación: Argentina

Publicidad

Notapor explorer » 2007-01-30 18:04 @794

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').
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Perl user » 2007-01-31 11:03 @502

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,
Marco A. Manzo
[email protected]
http://www.unixmonkeys.com/amnesiac/
Perl Programming Language
Perl user
Maestro honorario
Maestro honorario
 
Mensajes: 271
Registrado: 2004-11-03 21:11 @924


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados