• Publicidad

Separar un archivo log

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

Separar un archivo log

Notapor jeanmarc_tec » 2007-02-15 13:58 @623

Hola necesito ayuda tengo un archivo log el cual quiero separar línea a línea y separarlo por campos.

Ejemplo. Esta es la línea:
Código: Seleccionar todo
Tue Feb 13 19:07:35 2007; TCP; eth0; 1500 bytes; from 69.28.145.24:80 to 10.1.42.251:1341; first packet

y la quiero separada para insertarla a una base datos de la siguiente manera:

Código: Seleccionar todo
dia(dd) hora(hh) min(mm) segundo(ss) año(aaaa) protocolo interface tamaño ip1 ptoip1 ip2 ptoip2

13 19 07 35 2007 TCP eth0 1500 69.28.145.24 80 10.1.42.251 1341

para despues insertarlo a la base de datos.
jeanmarc_tec
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2007-02-01 15:10 @673

Publicidad

Notapor explorer » 2007-02-15 14:47 @658

Bienvenido a los foros de Perl en Español.

Tendrás que abrir el fichero (open()), leer línea por línea (while () {}), y en cada línea, separar los campos.

Veo que los campos están ya separados, por espacios en blanco, así que puedes usar split() para sacar todos los campos.

Luego, quitar caracteres que sobran, como los ';' del final de algunos campos (con chomp()).

Finalmente, con la ayuda de join(), sacar todos los campos, unidos esta vez con el campo " ", al fichero de salida (con print).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor jeanmarc_tec » 2007-02-15 15:00 @666

no esta separdo quiz ame explique bien lo que sucede es que tengo una archivo

de este tipo

Tue Feb 13 19:07:35 2007; TCP; eth0; 1500 bytes; from 69.28.145.24:80 to 10.1.42.251:1341; first packet
Tue Feb 13 19:07:35 2007; TCP; eth0; 1500 bytes; from 10.1.103.235:2418 to 204.15.20.20:80; first packet
Tue Feb 13 19:07:36 2007; TCP; eth0; 52 bytes; from 10.1.42.251:1341 to 69.28.145.24:80; first packet

y yo quiero recorrer linea por linea
y obtenr algo un archvivo archivo.sql con el formato siguiente


insert into log ('13' ,'19', '07', '35', '2007', 'TCP', 'eth0' ,'1500', '69.28.145.24', '80' '10.1.42.251', '1341')

y lo tengo hehco es bash y es muy lento al procesar, pero en esto de perl no soy todo un novato y leyendo en google en perl deberia ser mas rapido y mejor

si me pudiaran hechar la manos se lso agredecere mucho
jeanmarc_tec
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2007-02-01 15:10 @673

Notapor creating021 » 2007-02-15 15:28 @686

¡Sí, como dice explorer!

Intenta usando while y split, si quieres algo mas difícil y perfecto usa pack.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
open FL, "archivo.log" or die "Oops archivo.log: $!\n";
while (my $linea = <FL>){
  chomp;
  my @datos = split $linea; #esto separa todos los espacios
}
close FL;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Esa es la forma más fácil.

[editado por problemas de dislexia]
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Hasta horita tengo lo siguiente

Notapor jeanmarc_tec » 2007-02-15 16:00 @708

Con ayuda de ustedes hasta ahorita tengo esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
#
#

open ENTRADA, "date.log" or die "Oops data.log: $!\n";
while (my $linea = <ENTRADA>)
        {
        chomp;
        my @elementos=split(/;/,$linea);
        foreach $elemento (@elementos)
                {
                #       print "$cadena\n";
                }
                 $cadena=join(" ",@elementos);
                 print "$cadena\n";
                 }
close ENTRADA;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y el resultado es el siguiente

Código: Seleccionar todo
Tue Feb 13 19:07:35 2007  TCP  eth0  1500 bytes  from 69.28.145.24:80 to 10.1.42.251:1341  first packet


¿y ahora cómo le hago para poder procesar esa arreglo $cadena a modo de que quede así?

Código: Seleccionar todo
TCP eth0 1500 69.28.145.24 80 10.1.42.251 1341

o de la siguiente forma
Código: Seleccionar todo
insert into log values('TCP', 'eth0', '1500', '69.28.145'.'24', '80',' 10.1.42.251', '1341')
jeanmarc_tec
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2007-02-01 15:10 @673

Notapor creating021 » 2007-02-15 16:25 @726

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/env perl
#
#
 
open ENTRADA, "date.log" or die "Oops data.log: $!\n";
while (my $linea = <ENTRADA>) {
  chomp;
  my @elementos = split (/;/, $linea);
  #print (join "\n", @elementos), "\n";
  $elementos[8] =~ s/:/ /g;
  $elementos[9] =~ s/:/ /g;
  print "$elementos[5] $elementos[6] $elementos[7] $elementos[8] $elementos[9]\n";
}
close ENTRADA;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Aunque no lo he ejecutado debe de funcionar :wink:
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

no funciona

Notapor jeanmarc_tec » 2007-02-15 16:41 @737

no funciona no imprime nada solo las comillas

y el prel quedo asi




open ENTRADA, "date.log" or die "Oops data.log: $!\n";
while (my $linea = <ENTRADA>)
{
chomp;
my @elementos=split(/;/,$linea);
$cadena=join(" ",@elementos);
$elementos[5] =~ s/:/ /g;
$elementos[6] =~ s/:/ /g;
$elementos[7] =~ s/:/ /g;
$elementos[8] =~ s/:/ /g;
$elementos[9] =~ s/:/ /g;
#print "$cadena\n";
print "$elemento[5], $elemneto[6], $elemneto[7], $elemneto[8], $elemneto[9]\n";
}
close ENTRADA;

y ya le quite el $cadena=join(" ",@elementos);

y no funcion a :cry:
jeanmarc_tec
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2007-02-01 15:10 @673

Notapor explorer » 2007-02-15 16:50 @743

Yo veo muchos errores... ¿ $elemneto[8] ? ¿No será $elemento[8] ?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor jeanmarc_tec » 2007-02-15 16:55 @747

si de hecho ya lo puse correectamente pero no me funcion a :cry:

me despliega esta

first packet (SYN)
, , , ,
, , , ,
first packet (SYN)

y ya jugue con la posicion del arreglo
jeanmarc_tec
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2007-02-01 15:10 @673

Notapor jeanmarc_tec » 2007-02-15 17:18 @763

una pregunta mas

solo duda mas de de todas las anteriores

open ENTRADA, "date.log" or die "Oops data.log: $!\n";
while (my $linea = <ENTRADA>)
{
chomp;
my @elementos=split(/;/,$linea);
# $cadena=join(" ",@elementos);
$elementos[1] =~ s/ / /g;
$elementos[2] =~ s/ / /g;
$elementos[3] =~ s/bytes/ /g;
$elementos[4] =~ s/:/ /g;
$elementos[7] =~ s/:/ /g;
$elementos[8] =~ s/:/ /g;
#print "$cadena\n";
print "$elementos[1], $elementos[2], $elementos[3], $elementos[4] \n"
}
close ENTRADA;

y me da como salida esto

TCP, eth0, 46 , from 10.1.16.119 4617 to 64.214.84.187 80


y me imagino que en $elementos[x]=~s/ / /g ·esosparametros de de aver una forma de separarlo de la siguiente manera

TCP, eth0, 46 , 10.1.16.119, 4617,64.214.84.187, 80


si me prodrian hechar la mano se los agradesco de favor
jeanmarc_tec
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2007-02-01 15:10 @673

Siguiente

Volver a Básico

¿Quién está conectado?

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

cron