[awk] Extraire une donnée sur une ligne

Résolu
marco.marco Messages postés 29 Date d'inscription   Statut Membre Dernière intervention   -  
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   -
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 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Salut,

2 passage avec grep

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

0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   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 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Re,

grep + sed ;-)

grep -o 'donn.e3: nombre3' fichier|sed 's/.*: *//'
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
Re-

Il ne connait pas la valeur de "nombre3" ;-\
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Re,


grep -o 'donn.e3: [^]*' fichier|sed 's/.*: *//'
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
Manque le "pipe" ;-((

grep -o 'donn.e3: [^|]*' fichier|sed 's/.*: *//'
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   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 29 Date d'inscription   Statut Membre Dernière intervention   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 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
sed -n "s/.*${donnee3}: \([^|]*\).*/\1/p" fichier
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   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