• 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-07-04 13:06 @587

  • Las variables de las líneas 23 a 25 deben reinicializarse por cada archivo que se procese, no solo al principio. Faltan estas líneas:
    Sintáxis: [ Descargar ] [ Ocultar ]
    Using perl Syntax Highlighting
    1. undef $en_line;
    2. undef $seccion;
    3. undef @seccion;
    Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
  • Tienes una doble línea "while (<INPUT>) {", en las líneas 46 y 47. Eso provoca que no se procese la primera línea de los archivos.
Otros detalles:
  • @extensiones solo contiene 'txt' y 'TXT'. No necesitas esta variable ni el bucle de la línea 36 porque la expresión regular de la línea 37, con la opción /i ya tiene en cuenta el caso del cambio de mayúsculas. Las líneas 35 a 41 quedarían mejor así:
    Sintáxis: [ Descargar ] [ Ocultar ]
    Using perl Syntax Highlighting
    1.     $extension_correcta = $nombre_en_servidor =~ /[.]txt$/i;
    Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
  • con la ayuda de autodie, en la línea 11, no necesitas decir la frase 'or die "ERROR: No puedo abrir $file: $!\n";', salvo que quieras que el mensaje salga en español :)
  • la apertura y cierre del archivo $file, en las líneas 31 y 74, estaría mejor ponerlo dentro del if() de la línea 42 a 73. Así, el archivo solo se abre si la extensión es correcta
  • la variable $directorio no la estás usando para nada. Quizás te falta esta línea:
    Sintáxis: [ Descargar ] [ Ocultar ]
    Using perl Syntax Highlighting
    1. chdir $directorio;
    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: 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-07-04 14:08 @631

Perdón y sé que no está bien pedirlo pero ¿puedes pasarlo en blanco en el script, por favor?, porque estoy intentando hacer lo que me comentas y no me quedó muy claro :S
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-05 20:56 @914

Trate de armar el script pero no lo logro, ahora no me analiza la vty 5 15 (última line) =(

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. if ( @ARGV != 1 ) {
  4.     die "\nUse: $0 <dir>\n\n" . "   <dir>    \n";
  5.  
  6. }
  7.  
  8. $directorio = $ARGV[0];
  9. chomp $directorio;
  10. use feature say;
  11. use autodie;                           # «Es mejor morir que regresar con deshonor» --proverbio Klingon
  12.  
  13. # Extensiones permitidas
  14. @extensiones = ( 'txt', 'TXT' );
  15. use CGI ':standard';
  16.  
  17. my %informacion_recomendada = (
  18.     'con 0' => [ 'system reset', 'canales 2' ],
  19.     'vty 0' => [ 'system reset', 'canales 3' ],
  20.     'vty 5' => [ 'system reset', 'canales 3' ],
  21. );
  22.  
  23. my $en_line = '';
  24. my $seccion;                           # nombre de la sección
  25. my @seccion;                           # contenido de la sección
  26. chdir $directorio;
  27.  
  28. opendir( DIR, '.' );
  29. print "Analizando directorio - /$directorio/\n";
  30. while ( $file = readdir(DIR) ) {
  31.     undef $en_line;
  32.     undef $seccion;
  33.     undef @seccion;
  34.  
  35.     next if not -f $file;              # saltar al siguiente si no es un archivo txt
  36.     open( INPUT, $file ) or die "ERROR: No puedo abrir $file: $!\n";
  37.     $nombre_en_servidor = $file;
  38.     $nombre_en_servidor =~ s/ /_/gi;
  39.     $nombre_en_servidor =~ s!^.*(\\|\/)!!;
  40.     $extension_correcta = 0;
  41.     foreach (@extensiones) {
  42.         if ( $nombre_en_servidor =~ /\.$_$/i ) {
  43.             $extension_correcta = 1;
  44.             last;
  45.         }
  46.     }
  47.     if ($extension_correcta) {
  48.  
  49.         print "\t$file\n";
  50.  
  51.         while (<INPUT>) {
  52.             chomp;
  53.  
  54.             if ( not $en_line ) {      # aún no hemos encontrado un "line"
  55.                 next if not /^line/;   # y en esta línea,tampoco está. Saltamos a la siguiente
  56.  
  57.                 $en_line = 1;          # ¡encontrado!
  58.             }
  59.             elsif (/^!/) {
  60.                 last;                  # encontrado un '!' en una sección,terminamos inmediatamente
  61.             }
  62.  
  63.             if (/^line (.+)/) {        # analizamos si la línea contiene un 'line'
  64.                 if ($seccion) {        # si tenemos una sección ya leída,
  65.                     imprime_seccion(); # la procesamos
  66.                 }
  67.  
  68.                 my @palabras = split " ", $1;    # separamos por los espacios en blanco
  69.                 $seccion = join " ",
  70.                     @palabras[ 0, 1 ]; # recomponemos el nombre de la sección,con las dos primeras palabras
  71.                 undef @seccion;        # ponemos a cero el almacén
  72.                 next;                  # pasamos a la siguiente línea
  73.             }
  74.  
  75.             push @seccion, $_;         # una línea normal: la guardamos en la sección
  76.         }
  77.     }
  78.     close INPUT;
  79. }
  80. closedir DIR;
  81. imprime_seccion();                     # procesamos la última sección
  82.  
  83. sub imprime_seccion {
  84.     say uc $seccion;
  85.  
  86.     if ( not exists $informacion_recomendada{$seccion} ) {
  87.         say Tr( td( { -bgcolor => 'red' }, 'Sección no reconocida' ) );
  88.     }
  89.     else {
  90.         my @comandos_esperados = @{ $informacion_recomendada{$seccion} };
  91.         my @seccion_filtrada   = @seccion;
  92.  
  93.         ## Sacamos de la sección leída los comandos que esperamos
  94.         for my $comando_esperado (@comandos_esperados) {
  95.             @seccion_filtrada = grep { $comando_esperado ne $_ } @seccion_filtrada;
  96.         }
  97.  
  98.         ## Sacamos de los comandos esperados los comandos que hemos leído
  99.         for my $comando_leido (@seccion) {
  100.             @comandos_esperados = grep { $comando_leido ne $_ } @comandos_esperados;
  101.         }
  102.  
  103.         ## Informamos de los comandos esperados que no hemos encontrado
  104.         for my $comando_esperado (@comandos_esperados) {
  105.             say Tr( td("FALTA : $comando_esperado") );
  106.         }
  107.  
  108.         ## Informamos de los comandos que hemos recibido de más
  109.         for my $comando_leido (@seccion_filtrada) {
  110.             say Tr( td("MAL : $comando_leido") );
  111.         }
  112.     }
  113. }
  114.  
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: Búsqueda de parámetros en un archivo

Notapor explorer » 2013-07-06 07:03 @335

La línea
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. imprime_seccion();                     # procesamos la última sección
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

debe colocarse justo después del bucle while() de las líneas 51-76.
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-06 18:31 @813

Muchas 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 situ » 2013-07-06 21:37 @942

Vuelvo nuevamente con mis consultas =(

¿Hay alguna posibilidad de meter regex en:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my %informacion_recomendada = (
  2.     'con 0' => [ 'system reset', 'canales 2', 'datos 3' ],
  3.     'vty 0' => [ 'system reset', 'canales 3', 'datos 4' ],
  4.     'vty 5' => [ 'system reset', 'canales 3', 'datos 5' ],
  5. );
  6.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
?

Digamos que yo necesito, por ejemplo, que me tome como bien si aparece datos, digamos; no me importa lo que sigue, ya para mi está correcto, ya que solamente necesito que esté datos.

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-07 11:35 @524

Bien... el tema se sigue complicando... así que hace falta una solución más complicada...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use feature "say";
  4. use autodie;                    # «Es mejor morir que regresar con deshonor» --proverbio Klingon
  5.  
  6. use CGI ':standard';
  7.  
  8. my %informacion_recomendada = (
  9.     'con 0'     => [ 'system reset', 'canales 2', qr'datos \d+' ],
  10.     'vty 0'     => [ 'system reset', 'canales 3', ],
  11.     'vty 5'     => [ 'system reset', 'canales 3', ],
  12. );
  13.  
  14. my $seccion;            # nombre de la sección
  15. my @seccion;            # contenido de la sección
  16.  
  17. open my $LOG, 'server.txt';
  18. while (<$LOG>) {
  19.     chomp;
  20.  
  21.     my $es_eof = eof $LOG;                      # comprobamos si es fin de archivo
  22.  
  23.     if (/^!/ or /^line (.+)/ or $es_eof) {      # analizamos la línea, por si es especial
  24.         if ($seccion) {                         # si tenemos una sección leída,
  25.             imprime_seccion();                  # la procesamos
  26.         }
  27.  
  28.         last if /^!/ or $es_eof;                # terminamos enseguida si es fin de todas las secciones 'line'
  29.  
  30.         ## nueva sección 'line'
  31.         my @palabras = split " ", $1;           # separamos por los espacios en blanco
  32.         $seccion = join " ", @palabras[0, 1];   # recomponemos el nombre de la sección, con las dos primeras palabras
  33.         undef @seccion;                         # ponemos a cero el almacén
  34.  
  35.         next;                                   # pasamos a la siguiente línea
  36.     }
  37.  
  38.     next if not $seccion;                       # no guardamos línea si aún no estamos en ninguna sección
  39.  
  40.     push @seccion, $_;                          # una línea normal: la guardamos en la sección
  41. }
  42.  
  43. close $LOG;
  44.  
  45.  
  46. sub imprime_seccion {
  47.     say Tr(td({-bgcolor => '#F8AD18'}, uc $seccion));
  48.  
  49.     if (not exists $informacion_recomendada{ $seccion }) {
  50.         say Tr(td({-bgcolor => 'red'}, 'Sección no reconocida'));
  51.     }
  52.     else {
  53.         my @comandos_esperados = @{ $informacion_recomendada{ $seccion } };
  54.         my @comandos_no_ejecutados;
  55.  
  56.         ## Sacamos de la sección leída los comandos que esperamos
  57.         for my $comando_esperado (@comandos_esperados) {
  58.  
  59.             my $encontrado = 0;                         # ¿hemos encontrado el comando esperado en la seccion?
  60.             my @seccion_filtrada;                       # la @seccion, filtrada (sin los comandos esperados)
  61.    
  62.             for my $comando_leido (@seccion) {
  63.  
  64.                 if (ref($comando_esperado) eq 'Regexp') {       # si es una exp. reg.
  65.                    
  66.                     if ($comando_leido =~ /$comando_esperado/) {
  67.                         $encontrado = 1;
  68.                         next;
  69.                     }
  70.                 }
  71.                 elsif ($comando_leido eq $comando_esperado) {   # si es una cadena de caracteres
  72.                     $encontrado = 1;
  73.                     next;
  74.                 }
  75.  
  76.                 push @seccion_filtrada, $comando_leido;         # no coincide, lo recordamos para la siguiente vuelta
  77.             }
  78.  
  79.             @seccion = @seccion_filtrada;
  80.  
  81.             if (not $encontrado) {
  82.                 push @comandos_no_ejecutados, $comando_esperado;
  83.             }
  84.         }
  85.  
  86.  
  87.         ## Informamos de los comandos esperados que no hemos encontrado
  88.         for my $comando_no_ejecutado (@comandos_no_ejecutados) {
  89.             say Tr(td("FALTA : $comando_no_ejecutado"));
  90.         }
  91.  
  92.         ## Informamos de los comandos que hemos recibido de más
  93.         for my $comando_leido (@seccion) {
  94.             say Tr(td("MAL : $comando_leido"));
  95.         }
  96.     }
  97. }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Los cambios principales son:
  • En la definición de %informacion_recomendada, en caso de que queramos poner un patrón, lo marcaremos con qr(), que lo que hace es precisamente eso
  • El bucle de la 18 a la 42 se ha ampliado para contemplar el caso de fin de archivo, dentro del propio bucle: ya no es necesario llamar a imprime_seccion() al final del bucle
  • imprime_seccion() ha cambiado bastante. Pasamos de hacer una resta entre conjuntos a un doble bucle, recorriendo todos los comandos leídos en cada @seccion, por todos los @comandos_esperados. Si existe coincidencia entre los dos, se elimina la entrada correspondiente de los dos arrays de comandos. Al final, sigue quedando la misma diferencia entre los dos conjuntos, pero había que hacerlo así (es la forma que he encontrado) para contemplar el caso de que uno de los comandos esperados sea un patrón de exp. reg.
Lo he probado añadiendo un "datos 3", y funciona.
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-07 14:24 @642

Muchas gracias, creo que nunca iba a poder hacerlo =( , ahora tendré que ver cómo adaptar tu código al mio, en el sentido que yo debo correrlo sobre todos los .txt del directorio que le debo pasar como argumento.
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-09 20:30 @896

situ escribiste: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.


Al final usé este script y pude hacer las comprobaciones, sé que no es el más óptimo pero no logré hacer funcionar tu script.

Ahora detecté otro problema: muchas veces las configuraciones no tienen la line vty 5 15 por lo cual el script me informa que no tengo configurado los parámetros de ésta, pero al no tener esa línea está bien que no estén los parámetros.

Yo hasta el momento usaba esta regex para cortar el contenido y identificar la próxima line vty.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         if ($lineacon1 =~ m/^linea\scon1|^!/) {
  2.                 last;
  3.         }
  4.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Para la line vty 5 15 tengo esto, donde busco el signo para cortar el contenido del array, pero ahora no sé cómo hacer para que compruebe si existe o no la línea line vty 5 15.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  if ($linevty5 =~ m/^!/) {
  2.                 last;
  3.         }
  4.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Para no marearlos tanto la idea sería ver si está esa línea y sino está es que continúe con el script pero sin comprobar los parámetros de ésta ya que no existe.
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Anterior

Volver a Básico

¿Quién está conectado?

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