Recherche de pattern en SED

Résolu/Fermé
gunbol Messages postés 47 Date d'inscription mercredi 19 septembre 2007 Statut Membre Dernière intervention 18 mars 2016 - 5 déc. 2011 à 13:19
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 5 déc. 2011 à 19:27
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 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
Modifié par mamiemando le 5/12/2011 à 19:29
(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