• 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 situ » 2013-07-02 18:19 @805

Una consulta: ¿no se puede adaptar este código para hacer las comprobaciones de las cosas que están mal o faltan? Porque estoy intentando como me comentas y la verdad que no me sale y me pierdo más =(

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

Publicidad

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

Notapor explorer » 2013-07-02 19:11 @841

¡Je! Yo también estoy perdido... :roll: este tema lleva muchos días, y ya no me acuerdo de lo primero que hablamos.

¿Puedes publicar el código que llevas hecho y un trozo del archivo server.txt que tienes que procesar y decirnos qué salida esperas?

Recuerda que estos foros no están para resolver problemas profesionales, sino solo puntuales.
No queremos ser competencia desleal de ningún profesional o empresa...
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 19:34 @857

Perfecto, debajo dejo la explicación, el código no es para venderlo ni nada de eso solamente quiero aliviar un poco mis tareas.

Sintáxis: (server.txt) [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
hostname pepe
comando 1
comando 2
blaaaaaa
comando 3
line con 0
system reset
canales 2
acceso denegado
line vty 0 4
system reset
canales 3
acceso denegado2
line vty 5 15
system reset
canales 4
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Programa:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. ### Variables con la información recomendada
  4. @bcon0=("system reset","canales 2");
  5. @blinevty0=("system reset1","canales 3");
  6. @blinevty5=("system reset1","canales 3");
  7.  
  8. sub funcion_escribir {
  9.  
  10. ######################################################### Con 0 #########################################################
  11. foreach $linecon0(@linecon0) {
  12.         ## Paso al siguiente foreach cuando encuentro el nombre de la siguiente VTY o si comienza con un !
  13.         if ($linecon0 =~ m/^line\svty\s0\s4|^!/) {
  14.                 last;
  15.         }
  16.         else {
  17.                 # ACÁ NECESITO HACER LAS COMPROBACIONES QUE HACÍAMOS EN http://perlenespanol.com/foro/busqueda-de-parametros-en-un-archivo-t5955-30.html#p35017
  18.         }
  19. }
  20.  
  21. ######################################################### VTY 0 4#########################################################
  22. foreach $linevty0(@linevty0) {
  23.         ## Paso al siguiente foreach cuando encuentro el nombre de la siguiente VTY o si comienza con un !
  24.         if ($linevty0 =~ m/^line\svty\s5\s15|^!/){
  25.                 last;
  26.         }
  27.         else {
  28.             # ACÁ NECESITO HACER LAS COMPROBACIONES QUE HACÍAMOS EN http://perlenespanol.com/foro/busqueda-de-parametros-en-un-archivo-t5955-30.html#p35017
  29.  
  30.         }
  31. }
  32.  
  33. ######################################################### VTY 5 #########################################################
  34.  
  35. print F "<tr><td bgcolor=\"#F8AD18\">VTY 5</td></tr>\n";
  36. foreach $linevty5(@linevty5) {
  37.         ## Paso al siguiente foreach cuando encuentro el nombre de la siguiente VTY o si comienza con un !
  38.         if ($linevty5 =~ m/^line\svty\s16\s1510|^!/){
  39.                 last;
  40.         }
  41.  
  42.         else {
  43.             # ACÁ NECESITO HACER LAS COMPROBACIONES QUE HACÍAMOS EN http://perlenespanol.com/foro/busqueda-de-parametros-en-un-archivo-t5955-30.html#p35017
  44.  
  45.         }
  46. }
  47.  
  48.  
  49. $file= "server.txt";
  50.                                
  51. @linevty0=`grep -e \"^line vty 0\" -A20 \"$file\"`;
  52. @linecon0=`grep -e \"^line con 0\" -A20 \"$file\"`;
  53. @linevty5=`grep -e \"^line vty 5\" -A20 \"$file\"`;
  54.  
  55. funcion_escribir();
  56.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Perdón por el código pero es lo que pude hacer con mis conocimientos. Mi idea es hacer como antes: ver qué configuración está MAL y cuál FALTA. Lo que sucede es que ahora debo tener X cantidad de líneas luego de encontrar lo que puse en la regex del grep.
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-03 15:22 @682

A ver si hemos acertado, esta vez...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use feature say;
  3. use autodie;                    # «Es mejor morir que regresar con deshonor» --proverbio Klingon
  4.  
  5. use CGI ':standard';
  6.  
  7. my %informacion_recomendada = (
  8.     'con 0'     => [ 'system reset', 'canales 2' ],
  9.     'vty 0'     => [ 'system reset', 'canales 3' ],
  10.     'vty 5'     => [ 'system reset', 'canales 3' ],
  11. );
  12.  
  13. my $en_line = '';
  14. my $seccion;            # nombre de la sección
  15. my @seccion;            # contenido de la sección
  16.  
  17. open my $LOG, 'server.txt';
  18.  
  19. while (<$LOG>) {
  20.     chomp;
  21.  
  22.     if (not $en_line) {                         # aún no hemos encontrado un "line"
  23.         next if not /^line/;                    # y en esta línea, tampoco está. Saltamos a la siguiente
  24.  
  25.         $en_line = 1;                           # ¡encontrado!
  26.     }
  27.     elsif (/^!/) {
  28.         last;                                   # encontrado un '!' en una sección, terminamos inmediatamente
  29.     }
  30.  
  31.     if (/^line (.+)/) {                         # analizamos si la línea contiene un 'line'
  32.         if ($seccion) {                         # si tenemos una sección ya leída,
  33.             imprime_seccion();                  # la procesamos
  34.         }
  35.  
  36.         my @palabras = split " ", $1;           # separamos por los espacios en blanco
  37.         $seccion = join " ", @palabras[0, 1];   # recomponemos el nombre de la sección, con las dos primeras palabras
  38.         undef @seccion;                         # ponemos a cero el almacén
  39.         next;                                   # pasamos a la siguiente línea
  40.     }
  41.  
  42.     push @seccion, $_;                          # una línea normal: la guardamos en la sección
  43. }
  44. imprime_seccion();                              # procesamos la última sección
  45. close $LOG;
  46.  
  47.  
  48. sub imprime_seccion {
  49.     say Tr(td({-bgcolor => '#F8AD18'}, uc $seccion));
  50.  
  51.     if (not exists $informacion_recomendada{ $seccion }) {
  52.         say Tr(td({-bgcolor => 'red'}, 'Sección no reconocida'));
  53.     }
  54.     else {
  55.         my @comandos_esperados = @{ $informacion_recomendada{ $seccion } };
  56.         my @seccion_filtrada   = @seccion;
  57.  
  58.         ## Sacamos de la sección leída los comandos que esperamos
  59.         for my $comando_esperado (@comandos_esperados) {
  60.             @seccion_filtrada  = grep { $comando_esperado ne $_ } @seccion_filtrada;
  61.         }
  62.  
  63.         ## Sacamos de los comandos esperados los comandos que hemos leído
  64.         for my $comando_leido (@seccion) {
  65.             @comandos_esperados= grep { $comando_leido    ne $_ } @comandos_esperados;
  66.         }
  67.  
  68.         ## Informamos de los comandos esperados que no hemos encontrado
  69.         for my $comando_esperado (@comandos_esperados) {
  70.             say Tr(td("FALTA : $comando_esperado"));
  71.         }
  72.  
  73.         ## Informamos de los comandos que hemos recibido de más
  74.         for my $comando_leido (@seccion_filtrada) {
  75.             say Tr(td("MAL : $comando_leido"));
  76.         }
  77.     }
  78. }
  79.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
con el server.txt que has mostrado antes, sale esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. <tr><td bgcolor="#F8AD18">CON 0</td></tr>
  2. <tr><td>MAL : acceso denegado</td></tr>
  3. <tr><td bgcolor="#F8AD18">VTY 0</td></tr>
  4. <tr><td>MAL : acceso denegado2</td></tr>
  5. <tr><td bgcolor="#F8AD18">VTY 5</td></tr>
  6. <tr><td>FALTA : canales 3</td></tr>
  7. <tr><td>MAL : canales 4</td></tr>
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Lo único que hemos hecho es una simple aplicación de conjuntos: quitamos los elementos de un array que encontramos en el otro. Los elementos que quedan en un array son los MALos, y en el otro, los que FALTAN.
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-04 08:27 @394

Buen día, al final tengo que volver a molestar, tengo un problema con la última line vty. Ésta no termina nunca, ya que por ahora siempre buscamos "line" para hacer el break de cada sección. Lo que necesito es que la última "line" termine cuando encuentre un '!'.

Probé lo siguiente pero no me funciona:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.    ## Sacamos de los comandos esperados los comandos que hemos leído
  2.         for my $comando_leido (@seccion) {
  3.                   if ($comando_leido =~ m/^!/) {
  4.                 last;
  5.         }
  6.         else {
  7.                
  8.             @comandos_esperados= grep { $comando_leido    ne $_ } @comandos_esperados;
  9.         }
  10.                 }
  11.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


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-04 09:16 @428

Para procesar la última sección, hemos supuesto que llegamos al final del archivo. En ese momento se termina el bucle while(), y hay una llamada más a imprime_seccion(). Yo he supuesto que la última sección terminaba así, según el archivo que has puesto de prueba. Y ahora nos dices que no, que la última sección debe terminar cuando encuentre un carácter '!'. Hay que ser cuidadosos con los ejemplos...

Supongamos, ahora, que el archivo server.txt es este:
Sintáxis: (server.txt) [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
hostname pepe
comando 1
comando 2
blaaaaaa
comando 3
line con 0
system reset
canales 2
acceso denegado
line vty 0 4
system reset
canales 3
acceso denegado2
line vty 5 15
system reset
canales 4
!
otros comandos
y otro mas
incluso un
line vty 6 más
y fin
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
bueno, pues reeditando el código anterior (líneas 27 a 29), tenemos la misma salida que antes.
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-04 10:05 @461

Si te fijas el resultado no es el esperado, digamos en el resultado figura que "canales 3" se encuentra dentro de la sección "VTY 5" y en verdad en server.txt está dentro de "line vty 0 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-04 10:20 @472

Claro, porque eso es lo que indican las líneas 7 y siguientes:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my %informacion_recomendada = (
  2.     'con 0'     => [ 'system reset', 'canales 2' ],
  3.     'vty 0'     => [ 'system reset', 'canales 3' ],
  4.     'vty 5'     => [ 'system reset', 'canales 3' ],
  5. );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
En la sección "vty 5" decimos que esperamos que exista el comando 'canales 3', y en efecto, no está. Por eso lo marca como FALTA. En su lugar aparece 'canales 4', y lo marca como MAL.
En la sección "vty 0" decimos que esperamos que exista el comando 'canales 3', y sí que está.
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-04 10:43 @488

Te pido disculpas por el error, anda perfecto el script.
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-04 12:36 @567

Modificando un poco el script para que éste me deje analizar muchos archivos TXT de un mismo directorio, me encontré con los siguientes problemas:
- No me está tomando la regex del '!'
- Cuando son tres archivos el último lo analiza todo y no solo los "line"

Este es el script:
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.  
  27. opendir( DIR, '.' );
  28. print "Analizando directorio - /$directorio/\n";
  29. while ( $file = readdir(DIR) ) {
  30.     next if not -f $file;              # saltar al siguiente si no es un archivo txt
  31.     open( INPUT, $file ) or die "ERROR: No puedo abrir $file: $!\n";
  32.     $nombre_en_servidor = $file;
  33.     $nombre_en_servidor =~ s/ /_/gi;
  34.     $nombre_en_servidor =~ s!^.*(\\|\/)!!;
  35.     $extension_correcta = 0;
  36.     foreach (@extensiones) {
  37.         if ( $nombre_en_servidor =~ /\.$_$/i ) {
  38.             $extension_correcta = 1;
  39.             last;
  40.         }
  41.     }
  42.     if ($extension_correcta) {
  43.  
  44.         print "\t$file\n";
  45.  
  46.         while (<INPUT>) {
  47.             while (<INPUT>) {
  48.                 chomp;
  49.  
  50.                 if ( not $en_line ) {                          # aún no hemos encontrado un "line"
  51.                     next if not /^line/;                       # y en esta línea,tampoco está. Saltamos a la siguiente
  52.  
  53.                     $en_line = 1;                              # ¡encontrado!
  54.                 }
  55.                 elsif (/^!/) {
  56.                     last;                                      # encontrado un '!' en una sección,terminamos inmediatamente
  57.                 }
  58.  
  59.                 if (/^line (.+)/) {                            # analizamos si la línea contiene un 'line'
  60.                     if ($seccion) {                            # si tenemos una sección ya leída,
  61.                         imprime_seccion();                     # la procesamos
  62.                     }
  63.  
  64.                     my @palabras = split " ", $1;              # separamos por los espacios en blanco
  65.                     $seccion = join " ", @palabras[ 0, 1 ];    # recomponemos el nombre de la sección,con las dos primeras palabras
  66.                     undef @seccion;                            # ponemos a cero el almacén
  67.                     next;                                      # pasamos a la siguiente línea
  68.                 }
  69.  
  70.                 push @seccion, $_;                             # una línea normal: la guardamos en la sección
  71.             }
  72.         }
  73.     }
  74.     close INPUT;
  75. }
  76. closedir DIR;
  77. imprime_seccion();                     # procesamos la última sección
  78.  
  79. sub imprime_seccion {
  80.     say Tr( td( { -bgcolor => '#F8AD18' }, uc $seccion ) );
  81.  
  82.     if ( not exists $informacion_recomendada{$seccion} ) {
  83.         say Tr( td( { -bgcolor => 'red' }, 'Sección no reconocida' ) );
  84.     }
  85.     else {
  86.         my @comandos_esperados = @{ $informacion_recomendada{$seccion} };
  87.         my @seccion_filtrada   = @seccion;
  88.  
  89.         ## Sacamos de la sección leída los comandos que esperamos
  90.         for my $comando_esperado (@comandos_esperados) {
  91.             @seccion_filtrada = grep { $comando_esperado ne $_ } @seccion_filtrada;
  92.         }
  93.  
  94.         ## Sacamos de los comandos esperados los comandos que hemos leído
  95.         for my $comando_leido (@seccion) {
  96.             @comandos_esperados = grep { $comando_leido ne $_ } @comandos_esperados;
  97.         }
  98.  
  99.         ## Informamos de los comandos esperados que no hemos encontrado
  100.         for my $comando_esperado (@comandos_esperados) {
  101.             say Tr( td("FALTA : $comando_esperado") );
  102.         }
  103.  
  104.         ## Informamos de los comandos que hemos recibido de más
  105.         for my $comando_leido (@seccion_filtrada) {
  106.             say Tr( td("MAL : $comando_leido") );
  107.         }
  108.     }
  109. }
  110.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


No entiendo por qué tiene este comportamiento ahora =(
Última edición por explorer el 2013-07-04 12:53 @578, 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

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

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