• Publicidad

Búsqueda de parámetros en un archivo

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

Búsqueda de parámetros en un archivo

Notapor situ » 2011-04-12 09:48 @450

Estimados,
Poseo un script el cual tiene como finalidad analizar parámetros sobre un archivo en particular.

En este caso lo que hago es comparar las direcciones IP encontradas mediante la expresión regular contra las que tengo en el array "@sshmgt".

Hasta aquí todo funciona correctamente, ahora lo que quiero hacer es que aparte de realizar esta comparación, se fije que las IP puestas en el array se encuentren en la salida de la regex; si éstas no están quiero que me avise.

Con esto logro saber si las IP del archivo son las correctas y, por otro lado, si las IP del array se encuentran en el archivo.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. if ( @ARGV != 1 ) {
  3.  
  4.     die "\nUso: $0 <config>\n\n"
  5.         . "   <config>    config.cfg\n";
  6.  
  7. }
  8. $configuracion = $ARGV[0];
  9. @sshmgt = ( "1.1.1.1", "2.2.2.2", "3.3.3.3", "4.4.4.4" );
  10.  
  11. open( $archivo, "<", "$configuracion" ) || die "$!";
  12. while ( $resultado = <$archivo> ) {
  13.     if ( $resultado =~ m/^seteo hostname\s(.*)/ ) {
  14.         $hostname = $1;
  15.     }
  16.     elsif (
  17.         $resultado =~ m/^seteo server\s.*\snombres-servers\s(\"[0-9|\.].*)/ )
  18.     {
  19.         push( @sshmgta, $1 );
  20.  
  21.     }
  22. }
  23.  
  24. print "### Hostname ### \n$hostname\n";
  25.  
  26. print "### Servers ###\n";
  27. foreach $sshmgt1 (@sshmgta) {
  28.     if ( $sshmgt1 ~~ @sshmgt ) {
  29.         print "Server= $sshmgt1 -> OK\n";
  30.     }
  31.     else {
  32.         print "Server= $sshmgt1 -> MAL\n";
  33.     }
  34. }
  35. close $archivo;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Publicidad

Re: Búsqueda de parámetros en un archivo

Notapor explorer » 2011-04-12 11:00 @500

Perdón, pero debe ser que yo soy muy corto en el tema de lógica, pero no acabo de entender esto:

"lo que quiero hacer es que aparte de realizar esta comparación, se fije que las IP puestas en el array se encuentren en la salida de la regex; si éstas no están quiero que me avise."

¿No podrías poner un ejemplo de los ficheros de entrada y un ejemplo de la salida esperada?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Búsqueda de parámetros en un archivo

Notapor situ » 2011-04-12 13:08 @589

Archivo de entrada:
hostname hola
seteo server nombres-server 1.1.1.1
seteo server nombres-server 2.2.2.2
seteo server nombres-server 5.5.5.5


El script en estos momentos lo que hace es buscar las lineas que contengan "seteo server nombres-server [IP]" y guardar en un array las IP que encuentra, este array se llama: "sshmgta"

EL siguiente paso es comparar las IP de @sshmgta contra las de @sshmgt y me da como resultado:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
[IP] -> Ok
[IP] -> Mal.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Ahora bien lo que busco aparte de esto es que se fije si las IP que tengo en @sshmgt se encuentra en @ssmgta, con esto logro saber si falta alguna en la configuración.
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Re: Búsqueda de parámetros en un archivo

Notapor explorer » 2011-04-12 15:43 @697

Pues entonces es cuestión de repetir el bucle de las líneas 27 a 34, pero cambiando @sshmgta por @sshmgt, y al revés.

¿No?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Búsqueda de parámetros en un archivo

Notapor situ » 2011-04-12 21:20 @930

¡Okas! Muchas gracias.

Pensé que capaz se podía "achicar" y no repetir el bucle.

Saludos.
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Re: Búsqueda de parámetros en un archivo

Notapor pvaldes » 2011-04-13 04:59 @249

Revisa if exists()
pvaldes
Perlero nuevo
Perlero nuevo
 
Mensajes: 129
Registrado: 2011-01-22 12:56 @580

Re: Búsqueda de parámetros en un archivo

Notapor explorer » 2011-04-13 06:17 @303

No se trata de comprobar la existencia o no de un elemento de un array, si no de que un valor existe como elemento dentro de la lista de elementos que almacena un array.

exists(), además, no se puede aplicar a un elemento de un array, solo a los elementos de un hash (que es, realmente, lo que situ debería usar, pero no quiere ;) ).

En cambio, el Smart Mach ~~ sí que hace una búsqueda del valor por todos los elementos del array.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Búsqueda de parámetros en un archivo

Notapor situ » 2013-01-05 19:37 @859

Los molesto para pedirles ayuda, ya que no puedo resolver lo siguiente:

Mediante regex obtengo la siguiente línea, la cual es almacenada en el array "@username".
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  1. username mi_usuario acceso 1
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Ahora lo que necesito es realizar algunas comparaciones, contra mi array "@busername", ya que ésta contiene la lista de usuarios que yo necesito que estén presentes.

El primer "foreach" anda perfecto, ya que me dice qué usuario de los que obtuve mediante regex no se encuentra dentro del array "@busername".

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. foreach $username (@username) {
  2.     if ( $username =~ m/^username\s(.*)\sacceso/ ) {
  3.  
  4.         if ( $1 ~~ @busername ) {
  5.         }
  6.         else {
  7.             print F "<tr><td>Usuario= $1 -> MAL</td></tr>\n";
  8.         }
  9.     }
  10. }
  11.  
  12. # Este segundo bloque no me funciona.
  13.  
  14. foreach $username1 (@busername) {
  15.     foreach $username (@username) {
  16.         if ( $username =~ m/^username\s(.*)\sacceso/ ) {
  17.  
  18.             if ( $username1 ~~ $1 ) {
  19.             }
  20.             else {
  21.                 print F "<tr><td>Usuario= $username1 -> NO SE ENCUENTRA CONFIGURADO</td></tr>\n";
  22.             }
  23.         }
  24.     }
  25. }
  26.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿Alguien me puede ayudar a re-armar este bloque de código? Se que el código no es muy bueno pero es lo que pude armar desde lo poco que sé de Perl.

Saludos.
Última edición por explorer el 2013-01-05 20:22 @890, editado 1 vez en total
Razón: Formateado de código con Perltidy
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Re: Búsqueda de parámetros en un archivo

Notapor explorer » 2013-01-05 21:13 @926

Precisamente, el operador Coincidencia inteligente está para evitar muchos de los dobles bucles que hacíamos en el siglo pasado.

El truco está, primero, en ahorrar código sacando la información que nos interesa para que sea más fácil de tratar. En tu caso, hay que simplificar el acceso a @username, ya que estás continuamente extrayendo el nombre del usuario con una expresión regular. Mejor hacerlo una vez y ya está. Y segundo: usar la Coincidencia inteligente para comprobar la existencia de cada usuario en el array que nos interesa.

Aparte, te hago notar que para ejecutar solo la parte negada de un if(), puedes a) negar la condición, o b), usar unless().

Otro detalle: no puedes poner '>' dentro de un código HTML sin que pertenezca a una marca HTML. Debes escribirlo como '&gt;'. Si no, estarás escribiendo HTML erróneo.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. my @busername = qw(
  4.     manolo
  5.     margarita
  6.     fungencio
  7. );
  8.  
  9. my @username =
  10.     ( 'username rosa acceso 1'
  11.     , 'username manolo acceso 2'
  12.     , 'username manolo acceso 3'
  13.     , 'username garcia acceso 1'
  14.     , 'username margarita acceso 2'
  15.     , 'username antonio acceso 3'
  16. );
  17.  
  18. my @usuarios_que_han_accedido;
  19. foreach my $acceso (@username) {
  20.     if (   $acceso =~ m/^username\s(.*)\sacceso/ ) {
  21.         push @usuarios_que_han_accedido, $1;
  22.     }
  23. }
  24.  
  25. foreach   my $usuario_que_ha_accedido (@usuarios_que_han_accedido) {
  26.     unless ( $usuario_que_ha_accedido ~~ @busername ) {
  27.         print "<tr><td>Usuario= $usuario_que_ha_accedido -&gt; MAL</td></tr>\n";
  28.     }
  29. }
  30.  
  31. foreach   my $usuario_del_sistema (@busername) {
  32.     unless ( $usuario_del_sistema ~~ @usuarios_que_han_accedido ) {
  33.         print "<tr><td>Usuario= $usuario_del_sistema -&gt; NO SE ENCUENTRA CONFIGURADO</td></tr>\n";
  34.     }
  35. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Salida:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
<tr><td>Usuario= rosa -&gt; MAL</td></tr>
<tr><td>Usuario= garcia -&gt; MAL</td></tr>
<tr><td>Usuario= antonio -&gt; MAL</td></tr>
<tr><td>Usuario= fungencio -&gt; NO SE ENCUENTRA CONFIGURADO</td></tr>
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Pero... en cuestiones de comparación, de existencia de un elemento dentro de un conjunto, es mucho mejor usar los hash. Lo siguiente es mi versión:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;            # activa say(), strict y warnings;
  3. use CGI ':standard';
  4.  
  5. my @busername = qw(
  6.     manolo
  7.     margarita
  8.     fungencio
  9. );
  10.  
  11. my @username =
  12.     ( 'username rosa acceso 1'
  13.     , 'username manolo acceso 2'
  14.     , 'username manolo acceso 3'
  15.     , 'username garcia acceso 1'
  16.     , 'username margarita acceso 2'
  17.     , 'username antonio acceso 3'
  18.     );
  19.  
  20. my %usuarios_con_accesos;
  21. for my $acceso (@username) {
  22.     if ($acceso =~ /^username\s(.+?)\s/) {
  23.         $usuarios_con_accesos{$1} = 1;          # recordamos los usuarios que han accedido
  24.     }
  25. }
  26.  
  27. my %usuarios_del_sistema;
  28. for my $usuario (@busername) {
  29.     $usuarios_del_sistema{$usuario} = 1;        # recordamos los usuarios del sistema
  30. }
  31.  
  32. ## Vemos qué usuarios han accedido no están en el sistema
  33. # Para cada $usuario_accedido, de todos los %usuarios_con_accesos
  34. for my $usuario_accedido (keys %usuarios_con_accesos) {
  35.     # Si el $usuario_accedido no existe en el grupo de %usuarios_del_sistema
  36.     if (not exists $usuarios_del_sistema{$usuario_accedido}) {
  37.         say Tr(td("Usuario= $usuario_accedido -&gt; MAL"));                           # informamos
  38.     }
  39. }
  40.  
  41. ## Vemos qué usuarios del sistema no han accedido
  42. # Para cada $usuario_en_sistema, de todos los %usuarios_del_sistema
  43. for my $usuario_en_sistema (keys %usuarios_del_sistema) {
  44.     # Si el $usuario_en_sistema no existe en el grupo de %usuario_con_accesos
  45.     if (not exists $usuarios_con_accesos{$usuario_en_sistema}) {
  46.         say Tr(td("Usuario= $usuario_en_sistema -&gt; NO SE ENCUENTRA CONFIGURADO")); # informamos
  47.     }
  48. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
El resultado es el mismo, claro. Pero más rápido, ya que no hay búsquedas recorriendo listas de valores. Simplemente se compruebe la existencia o no de usuarios dentro de cada grupo.

Aparte... ¿qué ocurre si un usuario accede más de una vez...? Pues que con la solución de los array no nos daremos cuenta y lo reportaremos tantas veces como aparezca en la lista. Con los hash solo es "recordado" una vez, ya que las claves de los hash son únicas.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Búsqueda de parámetros en un archivo

Notapor situ » 2013-01-05 21:24 @933

Perfecto, muchas gracias.
Es una gran ayuda, tengo muchos bloques parecidos y voy a tratar de cambiarlos y usar hash.
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Siguiente

Volver a Básico

¿Quién está conectado?

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