• Publicidad

Obtener ciertas líneas de un LOG y mandarla a dif. archivos

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

Obtener ciertas líneas de un LOG y mandarla a dif. archivos

Notapor AdmChess » 2012-03-22 15:09 @673

¡¡¡Buenas tardes, Masters!!!

Es la primera vez que ingreso y, les soy sincero, de Perl no sé mucho. He trabajado con algunos scripts en Bash, pero a un 2%.

Mi problema es el siguiente: tengo un archivo LOG que va incrementando de acuerdo a un sistema automático de respaldos (Bacula). Necesito sacar ciertas líneas de este LOG y mandarlas a diferentes archivos (en base al nombre del usuario) para después mandarles por correo la información.

Ejemplo original.
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
05-Mar 10:50 baculausr-dir JobId 6882: Bacula baculausr-dir 2.4.4 (28Dec08): 05-Mar-2012 10:50:06
  Build OS:               x86_64-pc-linux-gnu debian lenny/sid
  JobId:                  6882
  Job:                    PabloGuajardoF.2012-03-05_10.00.00.06
  Backup Level:           Full
  Client:                 "PabloGuajardo-fd" 2.2.8 (26Jan08) Linux,Cross-compile,Win32
  FileSet:                "PabloGuajardo" 1969-12-31 18:00:00
  Pool:                   "File" (From Job resource)
  Storage:                "FileStorage" (From Job resource)
  Scheduled time:         05-Mar-2012 10:00:00
  Start time:             05-Mar-2012 10:06:49
  End time:               05-Mar-2012 10:50:06
  Elapsed time:           43 mins 17 secs
  Priority:               8
  FD Files Written:       20,403
  SD Files Written:       20,403
  FD Bytes Written:       33,853,464,354 (33.85 GB)
  SD Bytes Written:       33,858,518,721 (33.85 GB)
  Rate:                   13035.6 KB/s
  Software Compression:   None
  VSS:                    yes
  Storage Encryption:     no
  Volume name(s):         F00124|F00125
  Volume Session Id:      14
  Volume Session Time:    1330637054
  Last Volume Bytes:      11,136,921,813 (11.13 GB)
  Non-fatal FD errors:    0
  SD Errors:              0
  FD termination status:  OK
  SD termination status:  OK
  Termination:            Backup OK
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Con un grep he logrado hacer esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
 FileSet:                "JoseEsquivel" 2012-01-24 10:00:01
  Start time:             20-Mar-2012 13:41:06
  End time:               20-Mar-2012 13:43:16
  Elapsed time:           2 mins 10 secs
  FD Files Written:       0
  FD Bytes Written:       0 (0 B)
  Termination:            *** Backup Error ***
  FileSet:                "JoseEsquivel" 2012-01-24 10:00:01
  Start time:             22-Mar-2012 13:53:39
  End time:               22-Mar-2012 13:55:49
  Elapsed time:           2 mins 10 secs
  FD Files Written:       0
  FD Bytes Written:       0 (0 B)
  Termination:            *** Backup Error ***
  FileSet:                "FernandoGarcia" 2011-10-21 10:23:24
  Start time:             20-Mar-2012 13:48:28
  End time:               20-Mar-2012 13:50:38
  Elapsed time:           2 mins 10 secs
  FD Files Written:       0
  FD Bytes Written:       0 (0 B)
  Termination:            *** Backup Error ***
  FileSet:                "FernandoGarcia" 2011-10-21 10:23:24
  Start time:             22-Mar-2012 13:55:50
  End time:               22-Mar-2012 13:58:00
  Elapsed time:           2 mins 10 secs
  FD Files Written:       0
  FD Bytes Written:       0 (0 B)
  Termination:            *** Backup Error ***
  FileSet:                "MarcoArellano" 2011-12-13 10:00:01
  Start time:             20-Mar-2012 13:50:39
  End time:               20-Mar-2012 13:52:49
  Elapsed time:           2 mins 10 secs
  FD Files Written:       0
  FD Bytes Written:       0 (0 B)
  Termination:            *** Backup Error ***
  FileSet:                "MarcoArellano" 2011-12-13 10:00:01
  Start time:             22-Mar-2012 13:58:01
  End time:               22-Mar-2012 14:01:27
  Elapsed time:           3 mins 26 secs
  FD Files Written:       8,719
  FD Bytes Written:       4,001,452,508 (4.001 GB)
  Termination:            Backup OK -- with warnings
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Como verán, de la línea FileSET a la de Termination es lo que necesito mandar a diferentes archivos en base al nombre del usuario.

Espero haber sido claro con mi explicación.

Saludos cordiales.
AdmChess
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2012-03-22 13:31 @605

Publicidad

Re: Obtener ciertas líneas de un LOG y mandarla a dif. archi

Notapor explorer » 2012-03-22 15:20 @681

Bienvenido a los foros de Perl en Español, AdmChess.

¿Seguro que hay un espacio en blanco al principio de cada línea?

Por favor, repasa tu ejemplo. Mira que hay un botón de Editar Mensaje dentro de tu mensaje, por si tienes que hacer cambios.
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: Obtener ciertas líneas de un LOG y mandarla a dif. archi

Notapor AdmChess » 2012-03-22 17:25 @767

¿Que tal, Master? Buenas tardes, muchas gracias por contestar mi mensaje.

No entendí lo de los espacios en blanco. Anexo dos archivos; uno es el archivo original (log.txt), conforme se va haciendo un respaldo en automático va incrementando el archivo, no siempre lleva este orden, varía mucho en cuestión si se realizó o no el respaldo. El otro archivo que anexo es la obtención de las lineas por medio del grep y lo direcciono hacia otro archivo (lineas.txt).

Como se dará cuenta necesito separar por bloques y mandarlos a diferentes archivos en base al nombre del usuario, para que cada archivo quede así

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
 FileSet:                "MarcoArellano" 2011-12-13 10:00:01
  Start time:             22-Mar-2012 13:58:01
  End time:               22-Mar-2012 14:01:27
  Elapsed time:           3 mins 26 secs
  FD Files Written:       8,719
  FD Bytes Written:       4,001,452,508 (4.001 GB)
  Termination:            Backup OK -- with warnings
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Al final tener cerca de 100 archivos para después mandar cada uno por correo al usuario que le corresponde.


Saludos cordiales
Adjuntos
log.txt
(745.06 KiB) 31 veces
lineas.txt
(89.65 KiB) 38 veces
AdmChess
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2012-03-22 13:31 @605

Re: Obtener ciertas líneas de un LOG y mandarla a dif. archi

Notapor explorer » 2012-03-22 22:43 @988

Analizando el fichero de entrada, sí que tiene caracteres de espacio en blanco en las líneas que nos interesan:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
05-Mar 10:00 baculausr-dir JobId 6881: Start Backup JobId 6881, Job=RubenJaraF.2012-03-05_10.00.00.05
05-Mar 10:00 baculausr-dir JobId 6881: Using Device "FileStorage"
05-Mar 10:00 baculausr-sd JobId 6881: Volume "F00124" previously written, moving to end of data.
05-Mar 10:00 baculausr-sd JobId 6881: Ready to append to end of Volume "F00124" size=334066543099
05-Mar 10:06 baculausr-sd JobId 6881: Job write elapsed time = 00:06:26, Transfer rate = 60.02 M bytes/second
05-Mar 10:06 baculausr-dir JobId 6881: Bacula baculausr-dir 2.4.4 (28Dec08): 05-Mar-2012 10:06:47
  Build OS:               x86_64-pc-linux-gnu debian lenny/sid
  JobId:                  6881
  Job:                    RubenJaraF.2012-03-05_10.00.00.05
  Backup Level:           Full
  Client:                 "RubenJara-fd" 2.2.8 (26Jan08) Linux,Cross-compile,Win32
  FileSet:                "RubenJara" 2012-02-22 11:34:54
  Pool:                   "File" (From Job resource)
  Storage:                "FileStorage" (From Job resource)
  Scheduled time:         05-Mar-2012 10:00:00
  Start time:             05-Mar-2012 10:00:01
  End time:               05-Mar-2012 10:06:47
  Elapsed time:           6 mins 46 secs
  Priority:               8
  FD Files Written:       10,662
  SD Files Written:       10,662
  FD Bytes Written:       23,166,338,832 (23.16 GB)
  SD Bytes Written:       23,168,524,334 (23.16 GB)
  Rate:                   57059.9 KB/s
  Software Compression:   None
  VSS:                    no
  Storage Encryption:     no
  Volume name(s):         F00124
  Volume Session Id:      13
  Volume Session Time:    1330637054
  Last Volume Bytes:      357,252,581,889 (357.2 GB)
  Non-fatal FD errors:    0
  SD Errors:              0
  FD termination status:  OK
  SD termination status:  OK
  Termination:            Backup OK
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Con Perl puedes hacer todos esos pasos en un solo programa: extracción y envío por correo. No necesitas guardar el paso intermedio en los 100 archivos.

Te vale con algo como esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use v5.14;
  2. use Modern::Perl '2012';        # Somos modernos
  3. use autodie;                    # es mejor morir que regresar con deshonor (proverbio Klingon)
  4.  
  5. my $usuario;                    # nombre del usuario
  6. my $bloque = '';                # bloque de información
  7.  
  8. open my $log, '<', 'log.txt';
  9.  
  10. while (<$log>) {
  11.     if (/^\s+FileSet:/ .. /^\s+Termination:/) {         # si estamos en el tramo interesante...
  12.  
  13.         if (/FileSet:\s+"(.+?)"/) {                     # comienzo de un bloque
  14.             $usuario = $1;                              # nos quedamos con el nombre del usuario
  15.         }
  16.        
  17.         # si es una línea interesante...
  18.         if (/^\s+(?:FileSet|Start time|End time|Elapsed time|FD Files Written|FD Bytes Written|Termination):/) {
  19.             $bloque .= $_;                              # vamos acumulando el bloque
  20.         }
  21.  
  22.         if (/Termination:/) {                           # si se trata del final del bloque
  23.             say "Procesando bloque para $usuario";
  24.             say "[$bloque]";                            # lo procesamos
  25.  
  26.             $bloque = '';                               # inicializamos $bloque para el siguiente
  27.         }
  28.     }
  29. }
  30.  
  31. close $log;
  32.  
  33. __END__
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Donde dice que lo procesamos, ahí podríamos meter la parte de enviar el $bloque por correo.
Yo suelo usar este conjunto de módulos, para sacar mensajes:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use Email::Simple;
  2. use Email::Simple::Creator;
  3. use Email::Sender::Simple 'sendmail';
  4. use Email::Sender::Transport::SMTP '';
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Un ejemplo de confección y envío de correo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.             # definimos el método de transporte de correo
  2.             my $transport = Email::Sender::Transport::SMTP->new({
  3.                 host => 'localhost',
  4.                 port => 25,
  5.             });
  6.  
  7.             # construimos el correo
  8.             my $emailsimple = Email::Simple->create(
  9.                 header => [
  10.                     From           => '"VayaDescuento.com" <[email protected]>',
  11.                     To             => $email,
  12.                     Subject        => '[VayaDescuento.com] Registro confirmado de nuevo usuario',
  13.                     'Content-Type' => 'text/plain; charset=utf-8',
  14.                 ],
  15.                 body => $body,
  16.             );
  17.  
  18.             # envío del correo
  19.             sendmail($emailsimple, { transport => $transport });
  20.  
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


Volver a Básico

¿Quién está conectado?

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