Besoin d'aide sur awk (boucle et condition)

Résolu/Fermé
azuspam - 12 juil. 2016 à 14:50
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 - 13 juil. 2016 à 08:11
Bonjour,


J'aurais besoin d'aide pour "parser" une ligne xml, via un script sous awk, d'habitude j'ai pas de soucis car les champs sont fixes mais là les valeurs attendus peuvent varier au niveau place (voir être inexistante)

Voici la ligne que je cherche à parser :

<Application name="appname" frequency="D" status="down" host="localhost" date="tomorrow" maurice="toto" tata="youpi" titi="poutou">


Je cherche juste à récupérer la valeur de l'application name et du host. Je précise que je retire les caractères "<", ">" et les double quotes via un sed.

ci-dessous le début de mon script :


#!/usr/bin/awk -f

BEGIN {
FS="=| "
}
{
x = 1
while ( x < NF ) {
#print $(x+1)
if ($x=="Application" && $(x+1)=="name") {
appname=$(x+2)
#print $appname
}
if ($x=="host") {
machine="$(x+1)"
print $machine
break
}
x++
}
#print $appname":"$machine
}
END {
#afficher chaque couple appname:machine
}


Mais mon code doit être foireux car quand j'affiche les variable machine et appname, il me renvoie l'ensemble de la ligne.

Je dois louper un truc mais je n'arrive pas à voir où.

2 réponses

dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
13 juil. 2016 à 08:11
hello
avec awk
$ awk -v RS=" " -v FS='[="]' '/^name/ {printf $3 ":"} /^host/ {print $3}' fichier
appname:localhost
1
UnGnU Messages postés 1158 Date d'inscription lundi 2 mai 2016 Statut Contributeur Dernière intervention 22 décembre 2020 157
12 juil. 2016 à 16:21
Salut,

Par rapport à ce que tu fournis comme explications, cette syntaxe à base de sed pourrait faire l'affaire :

$ cat fich
<Application name="appname" frequency="D" status="down" host="localhost" date="tomorrow" maurice="toto" tata="youpi" titi="poutou">
<blabla name="appname" frequency="D" status="down" host="localhost" date="tomorrow" maurice="toto" tata="youpi" titi="poutou">
<Application name="nouveau_nom" frequency="D" status="down" host="toto" date="tomorrow" maurice="toto" tata="youpi" titi="poutou">



$ sed -rn '/^<Application name=/{s/.*name="([^"]*)".*host="([^"]*)".*/\1:\2/p}' fich
appname:localhost
nouveau_nom:toto


Mais, comme on n'a pas d'exemples concernant les éventuels champs manquants ou vides, je doute que ça fasse ce que tu veux ;-\
0
Bon... Pourquoi faire compliqué quand on peut faire simple :-)

Merci c'est exactement le résultat que je cherchais, je pensais pas que je pouvais aller aussi loin avec sed.

Si ça peut aider d'autres personnes, mon erreur provenait du fait que j'utilisais print et non pas printf, je viens de trouver comment faire avec awk, donc je pourrais rajouter les conditions dont j'ai besoin.

En tout cas Merci UnGnU.
0