Supuestamente $id es la variable que contiene el ID a hacer match, pues simplemente puedes poner dentro del bucle una línea como:

   print $line if ( $line =~ /^$id/ );

Lo que hace esto es que imprime la línea si es que esta empieza con el contenido de la variable $id, pero esto todavía tiene un inconveniente, que pasa si $id tiene un valor de longitud 3 es decir 3 caracteres pero este inicio coincide con un id de 5 caracteres es decir si tuvieras
123|...|...|...
12345|...|...|...

si buscar por el $id = 123 ambas líneas anteriores harán match así que puedes arreglarlo poniendo la barra vertical como delimitadora de id así:

   print $line if ( $line =~ /^$id\|/ );

Ahora en el ejemplo anterior no sólo buscará por un id que empieze con 123 sinó que exige que empieze por 123|

Saludos!

nmag only
__________

Amaya escribió::

Hola listeros,

Ando muy entretenida ;-) parseando unos bonitos logs ;-) y tengo un
problema que seguro que es la tontería más grande del mundo.

Tengo una expresión regular y necesito que haga un poco más:

# Abro un archivo
while (chomp($id = <FTAG>)){
        # Abro otro archivo
        while (chop($line = <FAUTH>)){
                # Esto me funciona, pero no muy bien
                $line =~ /.*?\|.*?\|.*?\|.*?\|.*?\|.*?\|(.*?.)\|.*?/ ;
                $encontrado  = $+ ;
                
                # Esto es lo que necesito que me encuentre:
                # La línea debe empezar por el contenido de la variable $id.
                $line = ~/^\$id\|.*?\|.*?\|.*?\|.*?\|.*?\|(.*?.)\|.*/;
                #####################################################
                #         ~~~~~ Cómo escribo esto????
                #####################################################
                $encontrado = $+ ;
                
                if($encontrado){
                       print $encontrado, "\n";
                }
        }
}

La línea típica de logs sería así:
4a10a003-f2da63e8c3-0|lxrhgpp04|2003-01-20 07:01:06,372|AUTH 
|[Thread-8]|1|AplicaciónCRC|1|351|1|0|0|0||
Abstrayendo:

        
$id|host|fecha|petición|algo|algo|$encontrado|más_cosas_que_no_me_interesan

Sólo quiero saber el campo $encontrado de la línea que empieza por $id.

Estoy empezando tanto con Perl como con las regexp y me cuesta un poco.
Gracias por vuestro tiempo :-)





--
Telefónica: Crece el ruido de la Co###ªf|#A==-<icàà[[ió+++ NO CARRIER




Responder a