Récupèrer une ligne et les suivantes jusqu'au prochain pattern

Récupèrer une ligne et les suivantes jusqu'au prochain pattern - Shell/Batch - Programmation

Marsh Posté le 11-07-2011 à 19:08:52    

Salut à tous,
 
Je me présente, asquel :) C'est la première fois que je poste sur ce forum, j'espère que tout se passera bien  :jap:  
 
J'ai une petite question aux pros du Bash / Shell tout ca quoi ^^
 
Voilà, j'ai un fichier de trace contenant au début de chaque ligne un identifiant de la session courante (normal jusque là), j'aimerais récupérer toutes les lignes contenant cet identifiant.
Bon jusque là j'aurais eu besoin de personne :)
 
Sauf que des fois dans mon fichier de traces, il y a une belle requete SQL écrite, et du coup ca fait un truc du genre :  
 
4e1ad10add2e8|general  |2011/07/11 12:31:39-1310380299.7891|debug|   |pdo_driver::exec - IUD SQL : INSERT INTO xxxxx (
                                `xxx` ,
                                `yyyy` ,
                                `zzz` ,
                                `bbb` ,
                                `ccc` ,
 
Lorsque je fais un grep / sed ou autre, je n'ai donc que la première ligne qui revient et pas le reste de ma requête sql.
Auriez vous une idée ?
 
Bien cordialement,
 
Axel
 

Reply

Marsh Posté le 11-07-2011 à 19:08:52   

Reply

Marsh Posté le 13-07-2011 à 19:35:21    

asquel a écrit :

Auriez vous une idée ?


Salut
 
Il te faut bien comprendre que si tu n'as rien qui te permettrait de différencier une ligne contenant le début de ton log d'une ligne contenant le milieu ou la fin de ton log, on ne pourra rien faire.
 
Cette base étant posée et admise, on va essayer de voir si on peut trouver une différence. A première vue avec ton exemple, je pencherais pour dire qu'une ligne contenant des pipes sera soit un log complet, soit un début de log. Et une ligne sans pipe sera la suite de la ligne précédente.
 
A partir de là, on peut poser l'algo suivant: on lit une ligne et on construit, avec la ligne lue, le log à afficher. Celui-ci ne sera affiché qu'une fois complet, c'est à dire quand on est sur une ligne indiquant un nouveau log.

Code :
  1. #!/bin/sh
  2. while read ligne
  3. do
  4.        # Vérifions s il y a un pipe
  5.        if echo "$ligne" |grep "|" 1>/dev/null
  6.        then
  7.            # Pipe donc on se trouve sur un nouveau log à traiter
  8.            # Mais d abord on gère et on affiche le log précédent (s il existe)
  9.            test -n "$log" && echo "$log"
  10.  
  11.            # Puisqu on est sur un nouveau log, on l initialise
  12.            log="$ligne"
  13.       else
  14.            # Pas de pipe donc on se trouve en milieu de log - On le rajoute alors au log en cours
  15.            log="$log $ligne"
  16.       fi
  17. done < fichier_log
  18.  
  19. # Ici on a traité la dernière ligne (dernier log) mais il n a pas été affiché vu que la boucle n affichait que le log précédent
  20. echo "$log"


 
Bon, j'ai tapé ça en live sans tester mais ça me semble pas mal...


Message édité par Sve@r le 13-07-2011 à 19:43:20

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed