• 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.

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

Notapor explorer » 2013-06-30 05:36 @275

Ahorraríamos mucho tiempo si publicaras un trozo del archivo que quieres procesar, aunque sea con datos falseados, como las IP.

Lo que en tu código es @bserver, en mi código se llama %usuarios_del_sistema. Lo que hice fue transformar un array en un hash, relacionando todos los nombres posibles de "manolo" con el usuario "manolo".

En tu caso, si siempre va a aparecer la palabra "conectividad", entonces el problema se puede reducir un poco más, pero no sé muy bien a qué te refieres con "otros parámetros". ¿Te refieres al '1.1.1.1' y al 'testing' que está en @bserver? Entonces no siempre aparece "conectividad"...

Lo dicho: necesitamos una copia real de tu trabajo. Un trozo significativo vale. Y los datos sensibles, los falseas.
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

Publicidad

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

Notapor situ » 2013-06-30 09:27 @435

El código es el que agregue en mi anterior mensaje.

Cuando hablo de parámetros son los que están en @bserver, digamos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. @bserver = ("1.1.1.1","testing","conectividad lan1");
  2.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Siempre voy a buscar esos y luego lo único que cambia es la palabra que sigue luego de "conectividad". Eso es lo único que cambia, ya que podría ser "conectividad lan1", "conectividad wlan2", "conectividad lan3", solamente puede estar esos 3 tipos de "conectividad".

Gracias.
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-06-30 13:17 @595

Pues entonces, si siempre aparece "conectividad", puedes capturar como nombre del servidor a lo que sigue esa palabra. Solo hay que modificar la exp. reg. para hacerlo. Y en @bserver, quitas la palabra "conectividad" de todos los servidores.
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-06-30 15:29 @687

No entendí muy bien tu respuesta, paso a contarte nuevamente.

Yo tengo lo siguiente en server1.txt:
server 1.1.1.1
server conectividad lan0
server testing

server2.txt:
server 1.1.1.1
server conectividad wlan1
server testing

Por lo cual en @bserver tengo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. @bserver = ("1.1.1.1","testing","conectividad lan0");
  2.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Pero como en server2.txt tengo "conectividad wlan1" el script me dice:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
conectividad wlan1 MAL
NO SE ENCUENTRA CONFIGURADO conectividad lan0
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Pero en verdad está bien que sea "conectividad wlan1", ya que puede variar.
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-06-30 20:35 @899

Pues con mi código, funciona...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use v5.16;
  4.  
  5. use CGI ':standard';
  6.  
  7. my %usuarios_del_sistema = (
  8.     'conectividad' => 'conectividad lan0|conectividad wlan1',
  9.     '1.1.1.1'   => '1.1.1.1',
  10.     'testing'   => 'testing',
  11.     'otro'      => 'otro',
  12. );
  13.  
  14. my $usuarios_del_sistema       = join '|', values %usuarios_del_sistema;
  15. my $regex_usuarios_del_sistema = qr/$usuarios_del_sistema/;
  16.  
  17. my @accesos =
  18.     ( 'server 1.1.1.1'
  19.     , 'server conectividad wlan1'
  20.     , 'server testing'
  21.     , 'server zanuto'
  22.     );
  23.  
  24. my %usuarios_con_accesos;
  25.  
  26. for my $acceso (@accesos) {
  27.  
  28.     if ($acceso =~ /^server\s(.+)/) {                   # si tenemos un acceso
  29.  
  30.         $usuarios_con_accesos{$1} = 1;                  # recordamos el usuario que ha accedido
  31.     }
  32. }
  33.  
  34. my $usuarios_con_accesos       = join '|', keys %usuarios_con_accesos;
  35. my $regex_usuarios_con_accesos = qr/$usuarios_con_accesos/;
  36.  
  37.  
  38. ## Vemos qué usuarios que han accedido no están en el sistema
  39. for my $usuario_accedido (keys %usuarios_con_accesos) {
  40.  
  41.     if ($usuario_accedido !~ /$regex_usuarios_del_sistema/) {   # si el usuario que ha entrado no está registrado en el sistema
  42.  
  43.         say Tr(td("Usuario= $usuario_accedido -> MAL"));     # informamos de una entrada ilegal
  44.     }
  45. }
  46.  
  47. ## Vemos qué usuarios del sistema no han accedido
  48. while ( my ($usuario_del_sistema, $regex_usuario_del_sistema) = each %usuarios_del_sistema) {
  49.  
  50.     my $ha_entrado;
  51.  
  52.     for my  $usuario_del_sistema_unico ( split '\|', $regex_usuario_del_sistema) {
  53.  
  54.         if ($usuario_del_sistema_unico =~ $regex_usuarios_con_accesos) {
  55.             $ha_entrado = 'sí';
  56.             last;
  57.         }
  58.     }
  59.  
  60.     if (not $ha_entrado) {
  61.         say Tr(td("Usuario= $usuario_del_sistema -> NO SE ENCUENTRA CONFIGURADO"));
  62.     }
  63. }
  64.  
  65. __END__
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
La salida es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
<tr><td>Usuario= zanuto -&gt; MAL</td></tr>
<tr><td>Usuario= otro -&gt; NO SE ENCUENTRA CONFIGURADO</td></tr>
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Solo he modificado las líneas con las entradas a procesar, y la expresión regular.

De todas maneras, si lo que nos interesa es solo la presencia de la palabra "conectividad", se puede simplificar un poco, sin tener que usar el truco de los '|' en la primera entrada del primer hash, cambiando la complejidad de la exp. reg., para que deseche lo que sigue a "conectividad".
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-06-30 22:50 @993

Muchas gracias, voy a probar.
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

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

Notapor situ » 2013-07-01 15:20 @680

Perdón, pero ahora estoy teniendo otra problemática con el script, lo anterior funcionó perfecto.

Obtengo los datos del archivo server.txt. Perdón, pero no sé cómo hacer el "grep" en Perl. Lo intenté y como no lo logré, lo dejé.

Aquí me quedo con las 20 líneas luego de identificar "linea con1":
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. @lineacon1=`grep -e \"^linea con1\" -A20 \"server.txt\"`;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


En @lineacon1 tengo algo como esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
linea con1
system reset
canales 2
acceso denegado
linea con2
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Como se puede apreciar, dentro de estas líneas tengo "linea con2", esto me muestra que en ya salí de "linea con1" y estoy entrando en otra configuración, y no debería hacerlo. Para esto, usé la siguiente regex:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. foreach $lineacon1(@lineacon1) {
  2.         ## Paso al siguiente foreach cuando encuentro el nombre de la siguiente línea o si comienza con un !
  3.         if ($lineacon1 =~ m/^linea\scon1|^!/) {
  4.                 last;
  5.         }
  6.                
  7.         else {
  8.            print F "$lineacon1\n";
  9.         }
  10. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Ahora mi problema se presenta en que debo hacer lo mismo que hicimos para "ntp": debo hacer comprobaciones y mostrar si algo está mal o si falta algún parámetro.

Digamos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. @blineacon0=("system reset","canales 2","acceso denegado")
  2.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


La verdad que traté de adaptar lo anterior pero ahora al tener la regex para ver cuando salto a "linea con2" me complicó todo.

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 explorer » 2013-07-02 05:14 @259

Está pasando lo de siempre: no nos contáis el problema entero, por lo que las soluciones que damos solventan pequeños problemas, pero no el problema principal. Y así no terminamos nunca. :cry:

El grep() en Perl existe como sentencia. Más información en perldoc -f grep.

Lo que puedes intentar es dividir el contenido de las líneas de server.txt de forma precisa antes de entrar en los bucles, y así no tienes que poner excepciones.
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-07-02 08:51 @410

Hola, el script que ingresé es el original que tengo. Pasa que muchas veces me surgen estas problemáticas a medida que necesito hacer nuevas funcionalidades.

El tema de dividir no entendí muy bien a qué te referís.

El grep lo uso porque necesito las líneas que le siguen a "linea con1" pero el contenido que necesito debe ser hasta "linea con2", por eso la regex :S y como no sé cómo seguir con las comprobaciones mandé el mensaje.

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 explorer » 2013-07-02 13:54 @621

Con dividir, me refiero a que partas el array con las líneas a procesar, en varios array, según lo que tengas que procesar.

Algo así como hacer la exp. reg. en un bucle anterior. De esa manera, en los bucles principales te ahorras poner excepciones, porque han quedado fuera.

Para procesar líneas de un archivo entre dos condiciones, lo más cómodo es usar el operador flip-flop:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
while (<leemos línea del archivo>) {

    if (/linea con1/ .. /linea con2/) {
        # aquí procesamos líneas para con1
    }
    if (/linea con2/ .. /linea con3/) {
        # lo mismo, para con2
    }
    if (/linea con3/ .. eof) {
        # aquí procesamos desde con3 hasta el fin de archivo
    }
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Ahora bien... no nos dices cuántos conX hay... ¿lo sabemos? Si no, pues habrá que usar una exp. reg.

Yo haría entonces algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my %cons;  # aquí guardamos las líneas, indexadas por el nombre del conX.
  2. my $con_actual = "ninguno";
  3.  
  4. while (<$archivo>) {
  5.     if (/^linea (con\w+)/) {    # en caso de ser una línea con conX, capturamos su nombre
  6.         $con_actual = $1;       # la recordamos
  7.         next;                   # leemos la siguiente línea
  8.     }
  9.     push @{$cons{$con_actual}}, $_;   # si es una línea normal, la almacenamos en un array indexado por el nombre de la conX.
  10. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
y al final tenemos un hash cuyas claves son los nombres de las conX, y los valores son referencias a array, que guarda una línea por cada línea del archivo dentro de la sección conX.

Y ya puedo procesar %cons, sabiendo que tengo todas las zonas separadas.
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

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

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