• Publicidad

Unir dos expresiones

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

Unir dos expresiones

Notapor tecolyn » 2017-08-28 19:56 @872

Buenos días, Foro de Perl.

Comunidad: les solicito su ayuda.

Tengo el siguiente problema. Tengo un log grande, pero recorté únicamente las líneas con las que estuve haciendo la prueba.

El tema es que no consigo obtener los valores que necesito, únicamente haciéndolo por separado.

El log es el siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Aug 25 15:50:05 casamx-server1 microsoft-windows-security-auditing[success] 4660 An object was deleted.Subject:Security ID:S-1-5-21-4082760969-1594227233-3128182536-500Account Name:AdministratorAccount Domain:casaLogon ID:0xa0574Object:Object Server:SecurityHandle ID:0x124cProcess Information:Process ID:0x1918Process Name:C:\Windows\explorer.exeTransaction ID:{00000000-0000-0000-0000-000000000000}
Aug 25 15:50:05 casamx-server1 microsoft-windows-security-auditing[success] 4663 An attempt was made to access an object.Subject:Security ID:S-1-5-21-4082760969-1594227233-3128182536-500Account Name:AdministratorAccount Domain:casaLogon ID:0xa0574Object:Object Server:SecurityObject Type:FileObject Name:C:\FIM\ServerWeb.xmlHandle ID:0x124cResource Attributes:S:AIProcess Information:Process ID:0x1918Process Name:C:\Windows\explorer.exeAccess Request Information:Accesses: DELETEAccess Mask:0x10000
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Lo que yo requiero es unir estas dos líneas de log en un sola para así, por medio de expresiones regulares, obtener algunos valores.

Cabe señalar que el evento 4660 y 4663 siempre vienen así: primero el 4660 y le sigue el 4663 pero no he podido realizarlo. Hasta ahorita llevo lo siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. my @f_deleted;
  3. my $f_deleted = 1;
  4. my $log = "busqueda.log";
  5. open MYLOG,$log;
  6. $f_deleted[0]= "<-FECHA,HORA,SERVIDOR,USUARIO,TIPO,REALIZO,ARCHIVO->";
  7. while (<mylog>){
  8. if ( $_ =~ /(?<FECHA>\w{3}\s+\d+)\s(?<HORA>\d+:\d+:\d+)\s(?<SERVIDOR>\w+-\w+).*ss].4663.\w.*..Subject.*Account.*Name:(?<USUARIO>.*).Account.Domain.*.Object.Type:.*Name:.(?<ARCHIVO>.*).Handle.*Accesses:.(?<REALIZO>\w+).*Mask:0x10000.*$/) {
  9. $f_deleted[$f_deleted] = "<-$+{FECHA},$+{HORA},$+{SERVIDOR},$+{USUARIO},$+{ARCHIVO},$+{REALIZO}->";
  10.                 $f_deleted += 1;
  11. }
  12. }
  13. close MYLOG;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Con esta parte del código únicamente obtengo los valores del evento 4663 pero lo que necesito es que el programa me valide primero la línea que tiene 4660 y se salte a la segunda a extraer los valores.

Me podrán echar una mano.

Saludos.
tecolyn
Perlero nuevo
Perlero nuevo
 
Mensajes: 1
Registrado: 2017-08-28 19:06 @837

Publicidad

Re: Unir dos expresiones

Notapor explorer » 2017-08-30 20:12 @884

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

Lo que se podría hacer es ampliar la expresión regular para que valide el evento 4660.

Me explico: en la expresión regular buscas por los detalles del 4664. Bueno, pues se trataría de aumentar esa expresión regular con los detalles de la 4660.

De esa manera, estás buscando por dos líneas consecutivas que respondan a ese patrón.

Pero... habría problemas si no son consecutivas. Quiero decir, si después del evento 4660 hay más líneas que no son 4663. ¿Y si alguna de esas líneas intermedias son más eventos 4660?

Aquí hay un ejemplo de código que detecta el caso de que los dos registros vayan seguidos. Pero es fácil de modificar para contemplar el caso de que existan varias líneas entre ellos.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.26;
  3. use utf8;
  4. use autodie;
  5. #use Regexp::Debugger;
  6.  
  7.  
  8. ## Definición de patrones
  9. my $s           = qr/\s+/;
  10. my $rx_FECHA    = qr/(?<FECHA> \w{3} $s \d+)            /x;
  11. my $rx_HORA     = qr/(?<HORA>  \d{2} : \d{2} : \d{2})   /x;
  12. my $rx_SERVIDOR = qr/(?<SERVIDOR> \S+ )                 /x;
  13. my $rx_PROCESO  = qr/\S+ \[ \w+ \]                      /x;
  14. my $rx_PREFIJO  = qr/$rx_FECHA $s $rx_HORA $s $rx_SERVIDOR $s $rx_PROCESO/x;
  15.  
  16. my $eol         = qr/(?:\x7f|$)/;
  17. my $rx_USUARIO  = qr/Account [ ] Name: \s* (?<USUARIO> .+?) $eol/x;
  18. my $rx_ARCHIVO  = qr/Object  [ ] Name: \s* (?<ARCHIVO> .+?) $eol/x;
  19. my $rx_REALIZO  = qr/Accesses:             (?<REALIZO> .+?) $eol/x;
  20.  
  21. my $rx_REGISTRO_4660 = qr/ ^ $rx_PREFIJO $s 4660 .+? $ /mx;
  22. my $rx_REGISTRO_4663
  23.     = qr/
  24.         ^
  25.         $rx_PREFIJO     $s
  26.         4663            .+?
  27.         $rx_USUARIO     .+?
  28.         $rx_ARCHIVO     .+?
  29.         $rx_REALIZO     .+?
  30.         $
  31. /mx;
  32.  
  33. ## Procesamiento
  34. my $archivo_log = 'code_40368.txt';
  35. my $log;
  36. do {
  37.     undef $/;                                   # modo aspiradora
  38.     open my $MYLOG, $archivo_log;
  39.     $log = <$MYLOG>;                            # leemos todo el archivo de golpe
  40.     close   $MYLOG;
  41. };
  42.  
  43. while ($log =~ /$rx_REGISTRO_4660 \n $rx_REGISTRO_4663/gx) {
  44.     say "Evento 4660-4663:";
  45.     say "\t$_ => $+{$_}" for keys %+;
  46. }
  47.  
  48. #my @campos = split /\x7f/, $línea;
  49. #say for @campos;
  50. #$línea =~ tr/\x7f/\n/;
  51.  
  52. __END__
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
La salida es algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Evento 4660-4663:
        SERVIDOR => casamx-server1
        FECHA => Aug 25
        ARCHIVO => C:\FIM\ServerWeb.xml
        USUARIO => Administrator
        HORA => 15:50:05
        REALIZO =>  DELETE
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Otra cosa...

Lo que haces con $f_deleted += 1; se hace de forma más cómoda con push() (agregar un registro a un array).
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 3 invitados