• Publicidad

Busqueda y extracción según un parámetro específico

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

Busqueda y extracción según un parámetro específico

Notapor GerardoMDP » 2007-06-13 14:54 @662

Hola! Soy nuevo en esto del Perl, tiempo atrás estuve leyendo un poco pero luego quedo arrumbado en el arcón de "temas para ver a futuro" pues ese futuro llegó ya que debo realizar una tarea para la cual Perl, creo, es lo ideal.

Debo a partir de archivos de log de un servidor, leer su contenido línea a línea, y según un <nombre> el cual SIEMPRE aparece de la forma: " user=<nombre>, " redirigir ("imprimir") dicha línea hacia un archivo ad-hoc.

Pero para ello debo crear cada archivo en el momento que lo encuentra al nombre por vez primera, y así seguir con todo el log (aprox. 200.000 líneas de código por cada "archivito").

La idea es luego tener un archivo generado por cada usuario con las líneas en la que aparece mencionado.

¡Sugerencias y ejemplos son bienvenidos!
GerardoMDP
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2007-06-13 14:29 @645

Publicidad

Notapor creating021 » 2007-06-13 15:26 @685

Primero abres el archivo y con while haces el resto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
while(my $linea = <FL>){
  print "En $. se encontro lo indicado" if $linea =~ /^user=<.*>/;
}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
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

Notapor explorer » 2007-06-13 17:15 @761

Bienvenido a los foros de Perl en Español.

El problema es muy típico de una administración de sistemas. De hecho, yo tengo un programa que hace eso mismo.

La solución (una de las posibles), es:
Código: Seleccionar todo
* Abrimos el fichero de log
* Para todas las líneas del fichero
*    Si la línea contiene un patrón /user=<(.+?)>/
*        $usuario = $1;
*        Si no se ha abierto un fichero para ese usuario (if ( !$fichero{$usuario} ))
*            Abrimos en escritura un nuevo fichero
*            El handle lo guardamos en $fichero{$usuario}
*        Escribimos la línea en el fichero abierto en $fichero{$usuario}  (print $fichero{$usuario})
* Fin del bucle
* Cerramos el fichero de log
* Para todos los ficheros abiertos (foreach (keys %ficheros))
*    Cerramos el fichero
* Fin del bucle
Aunque puede tener un problema: que el número de ficheros abiertos supere los recursos del sistema operativo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor GerardoMDP » 2007-06-14 07:49 @367

Gracias Explorer por tu respuesta y Creating por la línea de código, espero con ambas ya poder encarar mi problema, que como dice Explorer es "típico de una administración de sistemas" y de eso se trata justamente, rastrear cierto comportamiento de cierto usuario, pero como dije antes en 200.000 lineas de código x 20 o 30 logs.... se pone complicado hacerlo a simple vista, ¡jejejee!
GerardoMDP
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2007-06-13 14:29 @645

Notapor explorer » 2007-06-15 07:40 @361

A veces con un simple 'grep' suele valer.

O con configurar el logcheck del Linux, vale. Es la solución que adoptamos al final, pues no necesitábamos estadísticas globales, sino avisos puntuales.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
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 0 invitados