Besoin d'aide sur awk (boucle et condition)

Résolu
azuspam -  
dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   -
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

  1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    avec awk
    $ awk -v RS=" " -v FS='[="]' '/^name/ {printf $3 ":"} /^host/ {print $3}' fichier
    appname:localhost
    1
  2. UnGnU Messages postés 1468 Statut Contributeur 158
     
    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
    1. azuspam
       
      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