[awk] Extraire une donnée sur une ligne

Résolu
marco.marco Messages postés 30 Statut Membre -  
dubcek Messages postés 19021 Statut Contributeur -
Bonjour !

Une petite colle pour les pros du awk (ou du sed, cut and co ;-)):
Je voudrais, sous linux/unix, extraire une donnée sur une ligne de type :

|donnée1: nombre1|donnée2: nombre2|donnée3: nombre3|donnée4: nombre4|

Il me faudrait dans cet exemple récupérer "nombre3" à partir de "donnée3".

Je pourrais le faire avec un awk du style
awk -F "|" '{print $3}'' | cut -d":" -f2
Mais ca impliquerait que je sache qu'il soit placé en 3ème position dans ma ligne ce qui n'est pas le cas, je ne connais que "donnée3". Et avec un grep de ce "donnée3" je récupère toute la ligne...

Qulqu'un pourrait m'aider ??

Merci !!!


A voir également:

4 réponses

lami20j Messages postés 21644 Statut Modérateur, Contributeur sécurité 3 570
 
Salut,

2 passage avec grep

grep -o 'donn.e3: nombre3' fichier|grep -o nombre3

0
jipicy Messages postés 41342 Statut Modérateur 4 896
 
Salut,

Avec "sed" :

$ echo $A
|donnée1: nombre1|donnée2: nombre2|donnée3: nombre3|donnée4: nombre4|
$ echo $A | sed -n '/donnée3/s/.*donnée3: \([^|]*\).*/\1/p'
nombre3

;-))
0
lami20j Messages postés 21644 Statut Modérateur, Contributeur sécurité 3 570
 
Re,

grep + sed ;-)

grep -o 'donn.e3: nombre3' fichier|sed 's/.*: *//'
0
jipicy Messages postés 41342 Statut Modérateur 4 896
 
Re-

Il ne connait pas la valeur de "nombre3" ;-\
0
lami20j Messages postés 21644 Statut Modérateur, Contributeur sécurité 3 570
 
Re,


grep -o 'donn.e3: [^]*' fichier|sed 's/.*: *//'
0
jipicy Messages postés 41342 Statut Modérateur 4 896
 
Manque le "pipe" ;-((

grep -o 'donn.e3: [^|]*' fichier|sed 's/.*: *//'
0
lami20j Messages postés 21644 Statut Modérateur, Contributeur sécurité 3 570
 
Ben, c'était pour voir si tu fais attention ;-)

P.S. Pour eviter les malentendus, je dirais plutôt "le tube" ou "pipeline" ;-)))
0
marco.marco Messages postés 30 Statut Membre 1
 
Merci jipicy + lami20j :-)))))))))))

Je m'égarais avec mon awk...
Le grep -o ou le sed fonctionnent tous les 2, j'ai donc gardé le grep, un peu plus court (et un peu moins complexe pour moi ;-))
J'ai juste du remplacer les premieres apostrophes, juste après le -o du grep, par des guillemets sinon ca ne passait pas: le "donnée3" est variabilisé...
Et je me suis permis de remplacer le sed par un cut (histoire de dire que j'ai un peu bossé quand meme ;-))))), ce qui au final revient au meme...

grep -o "${donnee3}:[^|]*" nom_fichier |cut -d":" -f2
0
jipicy Messages postés 41342 Statut Modérateur 4 896
 
sed -n "s/.*${donnee3}: \([^|]*\).*/\1/p" fichier
0
dubcek Messages postés 19021 Statut Contributeur 5 637
 
hello
avec awk
$ echo "|donnée1: nombre1|donnée2: nombre2|donnée3: nombre3|donnée4: nombre4| " | awk 'BEGIN {RS="[|:]"} ; /donnée3/ {getline;print}'
 nombre3
$
0