• Publicidad

Procesar la salida de un texto

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

Procesar la salida de un texto

Notapor animal collective » 2010-11-23 09:43 @446

Estimados,

Necesito optimizar un script que estoy realizando. Actualmente éste tiene 1600 líneas y demora mucho su ejecución. Les explicaré lo que realiza mi script.

El script ejecuta un comando snmpwalk -v2c -c public localhost .1.3.6.1.4.1.x.x.x. Este comando me trae las conexiones establecidas en una página web, los números 1.3.6.4.1 representan la página web que quiero sacar las conexiones.

El resultado del comando anterior es el siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
NC-STAT-MIB::webAppInterfaceBytesReceived."/www.pagina1.com-port80" = Counter64: 20039725 bytes
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Luego, esta salida del comando la guardo en una variable.

El problema es que son 51 páginas web y en mi script ejecuto este comando 51 veces, luego uso la función substr() para cortar la variable y poder sacar los números de bytes, y el substr() lo realizo por cada página web, o sea, 51 veces.

Hace poco encontré un comando que me trae las conexiones de las 51 páginas web de una vez; gracias a esto no tengo que ejecutar el comando 51 veces. La salida del comando es la siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
NC-STAT-MIB::webAppInterfaceBytesReceived."/www.pagina1.com-port80" = Counter64: 20039725 bytes
NC-STAT-MIB::webAppInterfaceBytesReceived."/www.pagina2.com-port80" = Counter64: 41201214201 bytes
NC-STAT-MIB::webAppInterfaceBytesReceived."/www.pagina3.com-port443" = Counter64: 41201214201 bytes
NC-STAT-MIB::webAppInterfaceBytesReceived."/www.pagina4.com-port80" = Counter64: 244164357 bytes
NC-STAT-MIB::webAppInterfaceBytesReceived."/www.pagina5.com-port80" = Counter64: 183665309144 bytes
NC-STAT-MIB::webAppInterfaceBytesReceived."/www.pagina6.com-port80" = Counter64: 316954710 bytes
NC-STAT-MIB::webAppInterfaceBytesReceived."/www.pagina7.com-port443" = Counter64: 244164357 bytes
NC-STAT-MIB::webAppInterfaceBytesReceived."/www.pagina8.com-port443" = Counter64: 183665309078 bytes
NC-STAT-MIB::webAppInterfaceBytesReceived."/www.pagina9.com-port443" = Counter64: 316954710 bytes
NC-STAT-MIB::webAppInterfaceBytesReceived."/www.pagina10.com-port80" = Counter64: 55438314 bytes
NC-STAT-MIB::webAppInterfaceBytesReceived."/www.pagina11.com-port443" = Counter64: 55438314 bytes
NC-STAT-MIB::webAppInterfaceBytesReceived."/www.pagina12.com-port80" = Counter64: 15587216 bytes
NC-STAT-MIB::webAppInterfaceBytesReceived."/www.pagina12.com-port80" = Counter64: 192716572 bytes
NC-STAT-MIB::webAppInterfaceBytesReceived."/www.pagina14.com-port443" = Counter64: 192716572 bytes
NC-STAT-MIB::webAppInterfaceBytesReceived."/www.pagina15.com-port80" = Counter64: 18612577948 bytes
NC-STAT-MIB::webAppInterfaceBytesReceived."/www.pagina16.com-port443" = Counter64: 18612577948 bytes
NC-STAT-MIB::webAppInterfaceBytesReceived."/www.pagina17.com-port80" = Counter64: 299124126 bytes
NC-STAT-MIB::webAppInterfaceBytesReceived."/www.pagina18.com-port443" = Counter64: 299124126 bytes
NC-STAT-MIB::webAppInterfaceBytesReceived."/www.pagina19.com-port80" = Counter64: 2080973 bytes
NC-STAT-MIB::webAppInterfaceBytesReceived."/www.pagina20.com-port443" = Counter64: 116602223 bytes
NC-STAT-MIB::webAppInterfaceBytesReceived."/www.pagina21.com-port80" = Counter64: 3497541715 bytes
NC-STAT-MIB::webAppInterfaceBytesReceived."/www.pagina22.com-port80" = Counter64: 76321827 bytes
NC-STAT-MIB::webAppInterfaceBytesReceived."/www.pagina23.com-port443" = Counter64: 3497541715 bytes
NC-STAT-MIB::webAppInterfaceBytesReceived."/www.pagina24.com-port80" = Counter64: 121556328 bytes
NC-STAT-MIB::webAppInterfaceBytesReceived."/www.pagina25.com-port443" = Counter64: 121556328 bytes
NC-STAT-MIB::webAppInterfaceBytesReceived."/www.pagina26.com-port80" = Counter64: 9382117 bytes
NC-STAT-MIB::webAppInterfaceBytesReceived."/www.pagina27.com-port80" = Counter64: 132226068 bytes
NC-STAT-MIB::webAppInterfaceBytesReceived."/www.pagina28.com-port80" = Counter64: 3808727 bytes
NC-STAT-MIB::webAppInterfaceBytesReceived."/www.pagina29.com-port443" = Counter64: 132226068 bytes
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Estimados, mi consulta es la siguiente: ¿es posible guardar toda la salida del comando anterior en una variable y luego usar expresiones regulares o alguna función que me permita capturar la parte entera, poder cortar el texto hasta donde dice Counter64: y poder conservar la parte que sale los números?

Con un texto de una sola línea al parecer no es tan complejo, el problema es que es mucho el texto a procesar.

Estimados, toda sugerencia será bienvenida.

Muchas gracias por compartir sus conocimientos.

Saludos desde Chile
animal collective
Perlero Nuevo
Perlero Nuevo
 
Mensajes: 43
Registrado: 2010-10-17 17:53 @786
Ubicación: Chile

Publicidad

Re: Procesar la salida de un texto

Notapor explorer » 2010-11-23 09:50 @451

No estaría demás ver el código que estás usando.

Puedes usar una variable escalar para guardar todas las líneas en ella. O una variable array para guardar una línea en cada elemento de la lista. Se puede hacer de varias maneras.

La cuestión sería qué quieres hacer con las cifras. Si lo único que quieres es sumarlas, no te hace falta guardar nada: las vas sumando a medida de que vas obteniendo el texto.
JF^D Perl Programming Language
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 12939
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Procesar la salida de un texto

Notapor animal collective » 2010-11-23 10:02 @459

Estimado,

Adjunto el código realizado

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #! /usr/bin/perl
  2. # 11/11/2010
  3. # Log trafico APP web
  4.  
  5. use strict;
  6.  
  7.  
  8. my $fecha=`date +%d\\-%m\\-%Y\\ %H:%M:%S`;
  9. $fecha =~ s/^\s+//;
  10. $fecha =~ s/\s+$//;
  11.  
  12. # Consulta snmp que trae tráfico de la aplicación web
  13. my $snmp1=`snmpwalk -v2c -c public localhost .1.3.6.1.4.1.7118.3.1.19.1.1.18.28.47.83.111.100.105.109.97.99.45.99.108.45.70.53.47.83.111.100.105.109.97.99.45.99.108.45.56.48`;
  14. my $snmp2=`snmpwalk -v2c -c public localhost .1.3.6.1.4.1.7118.3.1.19.1.1.18.29.47.83.111.100.105.109.97.99.45.99.108.45.70.53.47.83.111.100.105.109.97.99.45.99.108.45.52.52.51`;
  15. my $snmp3=`snmpwalk -v2c -c public localhost .1.3.6.1.4.1.7118.3.1.19.1.1.18.33.47.118.105.97.106.101.115.102.97.108.97.98.101.108.108.97.46.99.108.47.118.105.97.106.101.115.45.112.111.114.116.56.48`;
  16. my $snmp4=`snmpwalk -v2c -c public localhost .1.3.6.1.4.1.7118.3.1.19.1.1.18.37.47.98.50.98.46.115.111.100.105.109.97.99.46.99.108.47.98.50.98.46.115.111.100.105.109.97.99.46.99.108.45.112.111.114.116.56.48`;
  17. my $snmp5=`snmpwalk -v2c -c public localhost .1.3.6.1.4.1.7118.3.1.19.1.1.18.38.47.98.50.98.46.115.111.100.105.109.97.99.46.99.108.47.98.50.98.46.115.111.100.105.109.97.99.46.99.108.45.112.111.114.116.52.52.51`;
  18. my $snmp6=`snmpwalk -v2c -c public localhost .1.3.6.1.4.1.7118.3.1.19.1.1.18.39.47.102.97.108.97.98.101.108.108.97.46.99.111.109.47.119.119.119.46.102.97.108.97.98.101.108.108.97.46.99.111.109.45.112.111.114.116.56.48`;
  19. my $snmp7=`snmpwalk -v2c -c public localhost .1.3.6.1.4.1.7118.3.1.19.1.1.18.39.47.119.112.46.102.97.108.97.98.101.108.108.97.46.99.108.47.119.112.46.102.97.108.97.98.101.108.108.97.46.99.108.45.112.111.114.116.56.48 `;
  20. my $snmp8=`snmpwalk -v2c -c public localhost .1.3.6.1.4.1.7118.3.1.19.1.1.18.39.47.119.116.46.102.97.108.97.98.101.108.108.97.46.99.108.47.119.116.46.102.97.108.97.98.101.108.108.97.46.99.108.45.112.111.114.116.56.48 `;
  21. my $snmp9=`snmpwalk -v2c -c public localhost .1.3.6.1.4.1.7118.3.1.19.1.1.18.40.47.98.50.98.46.115.111.100.105.109.97.99.46.99.111.109.47.98.50.98.46.115.111.100.105.109.97.99.46.99.111.109.45.112.111.114.116.52.52.51`;
  22.  
  23. # Corto el string para sacar solo la parte entera
  24. my $trafico1 = substr($snmp1,78);
  25. my $trafico2 = substr($snmp2,79);
  26. my $trafico3 = substr($snmp4,87);
  27. my $trafico4 = substr($snmp6,88);
  28. my $trafico5 = substr($snmp8,89);
  29. my $trafico6 = substr($snmp10,89);
  30. my $trafico7 = substr($snmp12,89);
  31. my $trafico8 = substr($snmp14,91);
  32. my $trafico9 = substr($snmp16,92);
  33. my $trafico10 = substr($snmp18,93);
  34.  
  35. # Creo la estructura que tendra el log: Fecha, Pagina web, Trafico
  36.  
  37. my $salida1 = $fecha.", Sodimac-cl-F5/Sodimac-cl-80, ".$trafico1;
  38. my $salida2 = $fecha.", Sodimac-cl-F5/Sodimac-cl-443, ".$trafico2;
  39. my $salida3 = $fecha.", viajesfalabella.cl/viajes-port80, ".$trafico3;
  40. my $salida4 = $fecha.", b2b.sodimac.cl/b2b.sodimac.cl-port80, ".$trafico4;
  41. my $salida5 = $fecha.", b2b.sodimac.cl/b2b.sodimac.cl-port443, ".$trafico5;
  42. my $salida6 = $fecha.", falabella.com/www.falabella.com-port80, ".$trafico6;
  43. my $salida7 = $fecha.", wp.falabella.cl/wp.falabella.cl-port80, ".$trafico7;
  44. my $salida8 = $fecha.", wt.falabella.cl/wt.falabella.cl-port80, ".$trafico8;
  45. my $salida9 = $fecha.", b2b.sodimac.com/b2b.sodimac.com-port443, ".$trafico9;
  46. my $salida10 = $fecha.", falabella.com/www.falabella.com-port443, ".$trafico10;
  47.  
  48. # Imprimo valores
  49.  
  50. print "$salida1 \n";
  51. print "$salida2 \n";
  52. print "$salida3 \n";
  53. print "$salida4 \n";
  54. print "$salida5 \n";
  55. print "$salida6 \n";
  56. print "$salida7 \n";
  57. print "$salida8 \n";
  58. print "$salida9 \n";
  59. print "$salida10 \n";
  60.  
Coloreado en 0.015 segundos, usando GeSHi 1.0.8.4


Lo que necesito hacer con esas cifras es crear un log que contenga el valor entero que arroja el comando snmwalk.

Tengo un crontab corriendo que ejecuta el siguiente script que es el que crea el log.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #! /usr/bin/perl
  2. # ejecuta script que crea log
  3. # 11/11/2010
  4.  
  5. use strict;
  6. system('./crea-log-Aplicaciones.pl >> GFAL-FWAPP-01.csv');
  7. exit(0);
  8.  
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4


Favor, ayúdame cómo abordar este problema, qué debería investigar para realizar el script que requiero.

Saludos
animal collective
Perlero Nuevo
Perlero Nuevo
 
Mensajes: 43
Registrado: 2010-10-17 17:53 @786
Ubicación: Chile

Re: Procesar la salida de un texto

Notapor explorer » 2010-11-23 11:43 @530

Has escrito demasiado...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #! /usr/bin/perl
  2. use POSIX 'strftime';
  3.  
  4. use strict;
  5. use warnings;
  6.  
  7. my $fecha = strftime "%d-%m-%Y %H:%M:%S", localtime;
  8.  
  9. my $CODIGO_RAIZ = '.1.3.6.1.4.1.7118.3.1.19.1.1.18';
  10.  
  11. my @codigos_paginas = (
  12.     [ 28, '/Sodimac-cl-F5/Sodimac-cl-80'            ],
  13.     [ 29, '/Sodimac-cl-F5/Sodimac-cl-443'           ],
  14.     [ 33, '/viajesfalabella.cl/viajes-port80'       ],
  15.     [ 37, '/b2b.sodimac.cl/b2b.sodimac.cl-port80'   ],
  16.     [ 38, '/b2b.sodimac.cl/b2b.sodimac.cl-port443'  ],
  17.     [ 39, '/falabella.com/www.falabella.com-port80' ],
  18.     [ 39, '/wp.falabella.cl/wp.falabella.cl-port80' ],
  19.     [ 39, '/wt.falabella.cl/wt.falabella.cl-port80' ],
  20.     [ 40, '/b2b.sodimac.com/b2b.sodimac.com-port443'],
  21. );
  22.  
  23. for my $codigo_ref (@codigos_paginas) {
  24.  
  25.     my $codigo = join q[.], $CODIGO_RAIZ, $codigo_ref->[0], unpack "c*", $codigo_ref->[1];
  26.  
  27.     my $snmp = qx(snmpwalk -v2c -c public localhost $codigo);
  28.  
  29.     my ($trafico) = $snmp =~ /(\d+) bytes/;
  30.  
  31.     print join(q[,], $fecha, $codigo_ref->[1], $trafico), "\n";
  32. }
  33. __END__
Coloreado en 0.009 segundos, usando GeSHi 1.0.8.4

El funcionamiento es el siguiente:
* en la línea 7 creamos la fecha usando la función strftime() del módulo POSIX, en lugar de ejecutar el comando externo date. Así, no dependemos de estar en un sistema que no tenga ese comando.

* en la 9 y 11 definimos las constantes de los códigos SNMP a crear. En la 9 está el código raíz para todas ellas. En la 11 definimos un array de array. Cada elemento de @codigos_paginas es un array que contiene dos valores: el numérico y el nombre de la página. Solo tenemos que cambiar estas líneas para que nuestro programa escanee otras páginas

* en la línea 23 iniciamos el bucle que recorra todos los @codigos_paginas

* en la línea 25 hacemos la composición del código SNMP. Unimos (join) con puntos el $CODIGO_RAIZ, el código numérico de la página, y los valores ASCII de la propia página

* ya solo queda, en la línea 27, llamar a snmpwalk

* y extraer el tráfico, en la línea 29, con la ayuda de una expresión regular, en la que indicamos que queremos quedarnos con el conjunto de dígitos (\d+) que están al lado de ' bytes'

* y finalmente, imprimimos el resultado.
JF^D Perl Programming Language
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 12939
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Procesar la salida de un texto

Notapor animal collective » 2010-11-23 14:54 @663

Estimado,

Está perfecto el script. Entrega la salida que necesitaba. Muchas gracias, MASTER.

Aprovechando el post te quería preguntar, para scripts futuros, cómo realizo lo siguiente:

Tengo el texto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
NC-STAT-MIB::webAppTcpConnectionsEstablished."/wt.falabella.cl/wt.falabella.cl-port80" = INTEGER: 218348
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

esta vez no tiene la palabra bytes al final, y necesito capturar el número. ¿Es posible realizar esto con el código similar al de la línea 29?
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my ($trafico) = $snmp =~ /(\d+) bytes/;
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
animal collective
Perlero Nuevo
Perlero Nuevo
 
Mensajes: 43
Registrado: 2010-10-17 17:53 @786
Ubicación: Chile

Re: Procesar la salida de un texto

Notapor explorer » 2010-11-23 15:04 @669

Solo hay que cambiar el patrón de búsqueda por otro que nos sirva. De la línea de ejemplo, veo que quizás el "ancla" que podemos usar es la palabra 'INTEGER: '. Así que entonces, quedaría:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     my ($trafico) = $snmp =~ /INTEGER: (\d+)/;
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


De hecho, ya que estamos en faena, podemos hacer que la expresión regular sirva para estos dos casos, a la vez:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     my ($trafico) = $snmp =~ /(?:INTEGER|Counter64): (\d+)/;
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


El (?: ... ) agrupa dos alternativas, separadas por '|'. Al final, nos quedaremos con la cifra que aparezca a la derecha de cualquiera de las dos palabras, 'INTEGER' o 'Counter64'.
JF^D Perl Programming Language
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 12939
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Procesar la salida de un texto

Notapor animal collective » 2010-11-23 16:03 @710

Gracias MASTER
animal collective
Perlero Nuevo
Perlero Nuevo
 
Mensajes: 43
Registrado: 2010-10-17 17:53 @786
Ubicación: Chile


Volver a Básico

¿Quién está conectado?

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

cron