Recherche de pattern en SED

Résolu
gunbol Messages postés 47 Date d'inscription   Statut Membre Dernière intervention   -  
mamiemando Messages postés 33769 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

Je suis en train de chercher un moyen de faire une recherche dans une log, et d'afficher les résultats sur un AIX 5.3

Ma log est de la forme suivante:
Elle contient des lignes du genre
05-DEC-2011 06:03:26 * (CONNECT_DATA=(SID=dbupqa10)(CID=(PROGRAM=D:\Opt\Oracle\Dev608\BIN\ifrun60.EXE)(HOST=blablabla)(USER=Anon000))) * (ADDRESS=(PROTOCOL=tcp)(HOST=x.x.x.x)(PORT=1839)) * establish * dblabla10 * 0

Je cherche une commande qui me permet de me lister tous les Users (en gras ci-dessus).
Je pense qu'avec un sed, cela est possible.

En gros, je voudrais faire: 'commande_magique monfichier' et cela me renvoie:
USER=Anon000

Pouvez vous m'aider ?

Je vous remercie d'avance.

Gunther

1 réponse

mamiemando Messages postés 33769 Date d'inscription   Statut Modérateur Dernière intervention   7 879
 
(mando@aldur) (~) $ cat toto.txt    
05-DEC-2011 06:03:26 * (CONNECT_DATA=(SID=dbupqa10)(CID=(PROGRAM=D:\Opt\Oracle\Dev608\BIN\ifrun60.EXE)(HOST=blablabla)(USER=Anon000))) * (ADDRESS=(PROTOCOL=tcp)(HOST=x.x.x.x)(PORT=1839)) * establish * dblabla10 * 0                                                                                                                                                     
05-DEC-2011 06:03:26 * (CONNECT_DATA=(SID=dbupqa10)(CID=(PROGRAM=D:\Opt\Oracle\Dev608\BIN\ifrun60.EXE)(HOST=blablabla)(USER=Anon000))) * (ADDRESS=(PROTOCOL=tcp)(HOST=x.x.x.x)(PORT=1839)) * establish * dblabla10 * 0    

(mando@aldur) (~) $ sed -e 's/.*\((USER=[^)]*)\).*/\1/' toto.txt   
(USER=Anon000)   
(USER=Anon000)   


Petite explication en lisant de gauche à droite le motif passé à sed :
- s/CHAINE/REMPL/ : on va substituer les lignes qui respectent le motif CHAINE par un motif décrit dans REMPL.

Regardons maintenant ce qui est dans CHAINE :
- \.* : n'importe quelle suite de caractère
- \( : début du premier morceau, référencé \1 dans REMPL
- (USER= : la suite de caractère (USER=
- [^)] : n'importe quel caractère autre que ')'
- [^)]* : n'importe quel caractère autre que ')' répété entre 0 et une infinité de fois
- ) ; le caractère )
- \) fin du premier morceau (référencé par \1 dans REMPL)

Maintenant passons à REMPL :
- \1 : on réécrit simplement le morceau extrait (sans rien ajouter ni à gauche ni a droite. Par exemple on aurait pu écrire >>>\1<<< pour écrire >>>Anon0<<<<.

Bonne chance
1