• Publicidad

Expresión regular

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

Expresión regular

Notapor situ » 2011-01-16 18:42 @821

Estimados,

Los molesto porque necesito de su ayuda.

Tengo un archivo el cual tiene el siguiente contenido:

- archivo.txt
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
configuracion hostname pepe
configuracion accesosAllow 1.1.1.1
configuracion accesosAllow 2.2.2.2
configuracion accesosAllow 3.3.3.3
configuracion metricas 10
configuracion listas marcos
configuracion servers 1
configuracion servers 2
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Mi idea es tratar de analizar el archivo para obtener lo siguiente:
- salida.txt
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Hostname-> pepe
accesoAllow -> 1.1.1.1
            -> 2.2.2.2
            -> 3.3.3.3
Serves -> 1
       -> 2
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Tengo este script que conseguí.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict ;
  3. die "Error : Could not open file for reading $!" unless open FILE, "<c.txt" ;
  4. my @strings = ("hostname", "accesosAllow", "servers") ;
  5. my $srcstr = join "|", @strings ;
  6. while (<FILE>) {
  7.         print "$`<$&>$'" ### for debugging only
  8.         if /$srcstr/g ;
  9. }
  10.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Pero la salida es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
configuracion <hostname> pepe
configuracion <accesosAllow> 1.1.1.1
configuracion <accesosAllow> 2.2.2.2
configuracion <accesosAllow> 3.3.3.3
configuracion <servers> 1
configuracion <servers> 2
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


No me sirve =( porque me muestra todo y no solo el valor que quiero yo.

Alguien me puede guiar, por favor.

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

Publicidad

Re: Expresión regular

Notapor explorer » 2011-01-16 21:41 @945

Esta es una forma de hacerlo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use common::sense;
  3. use autodie;
  4.  
  5. my $accesosAllow  = header('accesoAllow');
  6. my $servers       = header('Server');
  7.  
  8.  
  9. open my $fh, q[<], 'kk.txt';
  10.  
  11. while (my $linea = <$fh>) {
  12.  
  13.     given ($linea) {
  14.         when(/hostname (\w+)/) {
  15.             say "Hostname-> $1";
  16.         }
  17.         when(/(accesosAllow|servers) ([\d.]+)/) {
  18.             eval "\$$1->(\$2)";
  19.         }
  20.     }
  21. }
  22.  
  23. close $fh;
  24.  
  25.  
  26. sub header {
  27.     my $header = shift;
  28.  
  29.     return sub {
  30.             state $head;
  31.             $head //= $header;
  32.             say "$head -> $_[0]";
  33.             ($head = $header) =~ y/a-zA-Z/ / if $head eq $header;
  34.     }    
  35. }
  36.  
  37. __END__
  38. Hostname-> pepe
  39. accesoAllow -> 1.1.1.1
  40.             -> 2.2.2.2
  41.             -> 3.3.3.3
  42. Server -> 1
  43.        -> 2
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Expresión regular

Notapor situ » 2011-01-16 22:11 @965

Funciona perfecto muchas gracias.

Discúlpame que siga molestando, pero ¿se puede poner algún control para que me informe por ejemplo sino hay nada de "Servers" o sino existe?

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

Re: Expresión regular

Notapor explorer » 2011-01-17 08:11 @382

Si se trata de recordar cosas, eso lo resuelves muy fácilmente con un hash. Por cada cabecera encontrada, lo guardas en el hash. Finalizado el bucle, es fácil ver si existe o no determinada clave en el hash.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Expresión regular

Notapor situ » 2011-01-17 13:49 @617

Sabes que estoy probando y anda muy bien; tengo un solo problema por ahora a nivel estético y no puedo solucionarlo.

Quiero analizar el siguiente texto "auth-name" y en la salida se repite el "-" =( No sé cómo sacarlo.

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
auth-name   -> pedro
    -       -> juan
    -       -> marcos
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Re: Expresión regular

Notapor situ » 2011-01-17 14:40 @653

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use common::sense;
  3. use autodie;
  4.  
  5. my $authname      = header('auth-server');
  6. my $Server        = header('Server');
  7.  
  8.  
  9. open my $fh, q[<], 'kk.txt';
  10.  
  11. while (my $linea = <$fh>) {
  12.  
  13.     given ($linea) {
  14.         when(/hostname (\w+)/) {
  15.             say "Hostname-> $1";
  16.         }
  17.         when(/auth-name (\w+)/) {
  18.             $authname->($1);
  19.         }
  20.         when(/servers (\d+)/) {
  21.             $Server->($1);
  22.         }
  23.     }
  24. }
  25.  
  26. close $fh;
  27.  
  28. sub header {
  29.     my $header = shift;
  30.  
  31.     return sub {
  32.             state $head;
  33.             $head = $head // $header;
  34.             say "$head -> $_[0]";
  35.             ($head = $header) =~ y/a-zA-Z/ / if $head eq $header;
  36.     }    
  37. }
  38.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Re: Expresión regular

Notapor explorer » 2011-01-17 14:50 @659

En el operador y///, agrega el carácter '-' a la primera parte.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Expresión regular

Notapor situ » 2011-01-17 14:55 @663

Muchas gracias, como siempre es un lujo participar de este foro.

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

Re: Expresión regular

Notapor situ » 2011-01-17 15:57 @706

Mediante el código que posteé anteriormente ¿hay forma de ordenar los títulos con su contenido? Por que si lo ejecuto así como está no me entrega la información como es buscada.

Digamos yo espero.
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
- hostname
- accessallow
- servers
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


El output que me da es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
- accesallow
- hostname
-server
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


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

Re: Expresión regular

Notapor explorer » 2011-01-17 18:53 @828

No indicaste que el orden fuera importante, así que la solución al problema indicada es mostrar la información que nos interesa a medida de que se la va encontrando.

Pero si quieres sacarla en otro orden, deberás almacenarla y luego sacarla en ese nuevo orden.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado