Slackware & Office

la oficina, la comodidad, la seguridad

  • August 2007
    S M T W T F S
     1234
    567891011
    12131415161718
    19202122232425
    262728293031  
  • Categories

  • Archives

Parsear lsn_sidip.log con Perl

Posted by Javier on August 9, 2007

Hace un tiempo me pidieron parsear un archivo de Oracle llamado lsn_sidip.log.
El mismo es un quilombo, pero me pidieron datos relevantes como los siguientes:
hora, SID, Programa, terminal, Usuario, Protocolo, IP, Port, verificacion de conexion, similar a SID, ultimo campo

El tema era que con shell script demoraba mas de 30m en parsear todo, claro, parsear un archivo de 1gb linea por linea es un parto para un shell script, asi que decidi hacerlo en Perl, pero he de aqui que varios compañeros en otros lugares lo utilizan por que se los pase por correo, asi que lo atacho aqui tambien.

#!/usr/bin/perl
###############################################################################
# Titulo: parseo.lsn_sidip.pl
# Fecha: 18-abr-2007
# Creado por: Javier Clv
# Detalle: Script que parsea los campos del archivo lsn_sidip.log y los separa
# en campos por %. El script generar un archivo temporal con los datos
# filtrados en /tmp y luego de parsear el archivo temporal lo elimina, la
# salida la muestra por StandardOutput. Este script se genero para parsear
# el archivo lsn_sidip.log del servidor xxxx de empresa
# +———–+—————————+———————————–+
# | Fecha | Nombre y Apellido | Detalle |
# +———–+—————————+———————————–+
# | | | |
###############################################################################
$FILE=”/u00/app/oracle/product/920/network/log/lsn_sidip.log”;
open(ARCHIVOPROCESO,”$FILE”);

while () {
$_ =~ m/(\d*)\:(\d{0,2}-\w{0,3}-\d{0,4} \d{0,2}:\d{0,2}:\d{0,2}) \* \(\w*\_\w*\=\([\W*\_*\w*]*\=([\w*\.*\_*\d*\s*]*)\)[\w*\W*\_*\=*\s*\**\-*\d*\:*\(*\)*]*[\(\w*\_*\=*\.*\d*\)]*\(\w*\=\(\w*\=([\W*\w*\:*\\*\s*\.*]*)\)\(\w*\=([\W*\w*\:*\\*\s*\.*]*)\)\(\w*\=(\w*)\)\)\) \* \(\w*\=\(\w*\=(\w*)\)\(\w*\=([\d*\s*\w*\.*]*)\)\(\w*\=([\d*\w*\s*]*)\)\) \* (\w*) \* ([\_*\w*\.*\d*]*) \* ([\w*\.*\d*]*)/;
print (“$2 % $3 % $4 % $5 % $6 % $7 % $8 % $9 % $10 % $11 % $12 \n”);
}
close(ARCHIVOPROCESO);

Espero que sirva de algo.
Saludos

Leave a comment