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

Re: Expresión regular

Notapor situ » 2011-02-03 20:44 @905

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

Publicidad

Re: Expresión regular

Notapor situ » 2011-02-18 09:33 @440

No logro realizar una búsqueda =(

Lo que necesito hacer es lo siguiente:
- Buscar en el archivo la palabra acceso+numero: if($resultado =~ m/^server\sname.*(acceso\s[0-9|\.]*)\s/) {

- Luego abrir nuevamente el archivo y buscar lo obtenido en la regex anterior, así puedo imprimir toda la línea que contenga ese dato.

Alguien me puede ayudar =)

Gracias.

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.  
  6.       . "   <config>    config.cfg\n"
  7.       ;
  8.  
  9. }
  10. $configuracion= $ARGV[0];
  11. chomp $configuracion;
  12.  
  13. open($archivo, "<", "$configuracion")|| die "$!";
  14. while ( $resultado = <$archivo> ) {
  15. if($resultado =~ m/^server\sname.*(acceso\s[0-9|\.]*)\s/) {
  16. #me devuelve acceso 10
  17.         push (@accesslist,$1);
  18. }
  19. }
  20. close ($archivo);
  21.  
  22. open($archivo, "<", "$configuracion")|| die "$!";
  23. while ( $resultado =~ <$archivo> ) {
  24. foreach $accesslist(@accesslist) {
  25.  if($resultado =~ m/^$accesslist.*)\s/){
  26. print "\n\n\n$1\n\n\n";
  27.         push (@accesslist2,$1);
  28.  }
  29. }
  30. }
  31.  
  32. print "### acceso ###\n";
  33. foreach $accesslist2(@accesslist2) {
  34.                
  35.                         print "- Server= $accesslist2\n";
  36.        
  37.         }
  38. 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

Re: Expresión regular

Notapor explorer » 2011-02-18 17:33 @773

Para mi sería más claro ver un ejemplo del fichero de entrada...
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: Expresión regular

Notapor situ » 2011-02-18 18:11 @799

El contenido es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
!
username dmin password casasasas
username user1 password asdasdasdasdad
!
server name asdsadasda active acceso 31
server name 13212ssss3 active acceso 31
!
acceso 31 permit 2.2.2.0 0.0.0.255
acceso 31 permit 1.1.1.0 0.0.0.255
acceso 31 permit 3.3.3.0 0.0.0.31
acceso 10 deny tcp any any eq 131
acceso 10 deny tcp any any eq 132
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


La idea es encontrar, primero, qué acceso se encuentra en "server" y buscarlo para encontrar las IP que están asociadas.

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

Re: Expresión regular

Notapor explorer » 2011-02-18 19:23 @849

No hace falta leer un fichero más de una vez... si vamos guardando la información que nos interesa en estructuras de datos, luego la podemos recuperar de forma ordenada a lo que queremos extraer.

Por ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use common::sense;
  3. use File::Slurp;
  4.  
  5. my @fichero = read_file('kk.txt');
  6.  
  7. my %servidores;
  8. my %accesos;
  9.  
  10. for (@fichero) {                                                                # para todo el fichero...
  11.  
  12.     if (/^server name (?<servidor>\w+) (?:active|desactive) (?<acceso>\w+ \d+)/) {
  13.  
  14.         $servidores { $+{servidor} } =                      $+{acceso};         # solo hay una definición de servidor
  15.     }
  16.     if (/^(?<acceso>\w+ \d+) (?<resto>.+)/) {
  17.  
  18.         push @{$accesos{ $+{acceso} }}, $+{resto};                              # puede haber más de una línea por acceso
  19.     }
  20. }
  21.  
  22. while (my($servidor, $acceso) = each %servidores) {                             # para cada servidor...
  23.  
  24.     if (exists $accesos{ $acceso }) {                                           # si existe la definición de su acceso...
  25.  
  26.         say "Lista de accesos para el servidor $servidor:";
  27.  
  28.         for my $descripción_acceso (@{$accesos{$acceso}}) {                     # listado de todos los accesos
  29.  
  30.             say "\t$acceso : ", $descripción_acceso;
  31.         }
  32.     }
  33.     else {
  34.  
  35.         say "El servidor $servidor no tiene accesos.";
  36.     }
  37. }
  38.  
  39. __END__
  40. Lista de accesos para el servidor asdsadasda:
  41.         acceso 31 : permit 2.2.2.0 0.0.0.255
  42.         acceso 31 : permit 1.1.1.0 0.0.0.255
  43.         acceso 31 : permit 3.3.3.0 0.0.0.31
  44. Lista de accesos para el servidor 13212ssss3:
  45.         acceso 31 : permit 2.2.2.0 0.0.0.255
  46.         acceso 31 : permit 1.1.1.0 0.0.0.255
  47.         acceso 31 : permit 3.3.3.0 0.0.0.31
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


No sé si esta es la salida que buscas.
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: Expresión regular

Notapor situ » 2011-02-18 19:30 @854

Sí, voy a tratar de adelantarlo al script que tengo =), ya que solo necesitaba las IP porque tengo un array para realizar comprobaciones, para ver si las que figuran son las correctas o están de más.

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

Re: Expresión regular

Notapor situ » 2011-02-18 19:53 @870

Perdón que copie el código nuevamente pero no estoy logrando adaptarlo, perdón que insista pero la verdad no logro hacerlo andar =(

Me había olvido poner en el ejemplo anterior la parte del hostname...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. if ( @ARGV != 1 ) {
  3.     die "\nUso: $0 <config>\n\n"
  4.  
  5.       . "   <config>    config.cfg\n"
  6.       ;
  7. }
  8. $configuracion= $ARGV[0];
  9. chomp $configuracion;
  10.  
  11. open($archivo, "<", "$configuracion")|| die "$!";
  12. while ( $resultado = <$archivo> ) {
  13.     if ($resultado =~ m/^hostname\s(.*)/){
  14.         $hostname = $1;
  15.     }
  16.     elsif ($resultado =~ /server name (?<servidor>\w+) (?:active|desactive) (?<acceso>\w+ \d+)/) {
  17.         {
  18.             $+{acceso};
  19.         }
  20.         if (/^(?<acceso>\w+ \d+) (?<resto>.+)/) {
  21.             push @{$accesos{ $+{acceso} }}, $+{resto};    # puede haber más de una línea por acceso
  22.         }
  23.         while (my($acceso)) {                             # para cada servidor...
  24.  
  25.             if (exists $accesos{ $acceso }) {             # si existe la definición de su acceso...
  26.  
  27.                 for my $descripcion_acceso (@{$accesos{$acceso}}) {   # listado de todos los accesos
  28.  
  29.                     print "\t$acceso : ", $descripcion_acceso;
  30.                 }
  31.             }
  32.             else {
  33.                 print "El servidor $acceso no tiene accesos.";
  34.             }
  35.         }
  36.     }
  37. }
  38.  
  39. print "### Hostname ### \n$hostname\n";
  40. close ($archivo);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


No puedo tomar el parámetro "name" ya que aveces es otro, por eso quería buscar solamente "acceso 31", ya que éste siempre es igual; solamente cambia su número.
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Re: Expresión regular

Notapor explorer » 2011-02-18 20:04 @877

Me parece que te has liado con las llaves...

Es importante tener un buen sangrado del código, para ver qué es lo que está dentro de qué. Y usar un editor de texto que, teniendo el cursor encima de una llave, coloree la correspondiente. Así sabemos si falta o sobra alguna.

Te he editado el código y, como verás, tienes metido el while() dentro del bucle de lectura. El while() lo uso cuando ya he leído todo el fichero, es decir, cuando tengo toda la información almacenada.
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: Expresión regular

Notapor situ » 2011-02-19 13:39 @610

Sabes que estoy probando y no me funciona , solamente encuentra el hostname =(

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

Re: Expresión regular

Notapor explorer » 2011-02-19 13:43 @613

No sabía nada que hubiera un hostname. En el ejemplo que publicaste no aparece nada de eso.

Publica el código que tienes ahora, a ver qué es lo que pasa...
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 20 invitados