2014-08-27 2 views
0

je dois charger un fichier XML et boucle à travers une liste de noeuds pour exécuter un script shell pour chacun en utilisant les attributs pour chaque nœud en tant que paramètres pour le script. Des idées? Toute aide sera très appréciée.Itérer/XML Loop Through Liste Node

Exemple de fichier XML:

<Config> 
    <FREQUENCY>EVERYTIME</FREQUENCY> 
    <TIMEOUT>60</TIMEOUT> 
<COMMAND>/opt/test1.sh</COMMAND> 

<FREQUENCY>EVERYTIME</FREQUENCY> 
    <TIMEOUT>30</TIMEOUT> 
    <COMMAND>/opt/test2.sh</COMMAND> 
</Config> 
+0

tu ne peux pas faire 2 lignes d'entrée dans un fichier texte normal et le processus, il avec 'while read line; faire eval $ line; done <$ fichier'? Bonne chance. – shellter

Répondre

1

La solution la plus simple implique une modification dans le fichier xml: contenir la fréquence/temporisation/balises commande dans une autre balise:

xmlstarlet sel -t -m /Config/x -v FREQUENCY -o : -v TIMEOUT -o : -v COMMAND -nl <<END 
<Config> 
    <x> 
    <FREQUENCY>EVERYTIME</FREQUENCY> 
    <TIMEOUT>60</TIMEOUT> 
    <COMMAND>/opt/test1.sh</COMMAND> 
    </x> 

    <x> 
    <FREQUENCY>EVERYTIME</FREQUENCY> 
    <TIMEOUT>30</TIMEOUT> 
    <COMMAND>/opt/test2.sh</COMMAND> 
    </x> 
</Config> 
END 
EVERYTIME:60:/opt/test1.sh 
EVERYTIME:30:/opt/test2.sh 

Sinon, en supposant que votre fichier xml est ce simple (et je en utilisant des outils détestent de traitement de texte XML):

awk -F '[<>]' -v OFS=: ' 
    $2 == "FREQUENCY" {f=$3} 
    $2 == "TIMEOUT" {t=$3} 
    $2 == "COMMAND" {c=$3} 
    f && t && c {print f,t,c; f=t=c=""} 
' <<END 
<Config> 
    <FREQUENCY>EVERYTIME</FREQUENCY> 
    <TIMEOUT>60</TIMEOUT> 
    <COMMAND>/opt/test1.sh</COMMAND> 

    <FREQUENCY>EVERYTIME</FREQUENCY> 
    <TIMEOUT>30</TIMEOUT> 
    <COMMAND>/opt/test2.sh</COMMAND> 
</Config> 
END 
EVERYTIME:60:/opt/test1.sh 
EVERYTIME:30:/opt/test2.sh 

Dans les deux cas, vous pouvez diriger la sortie vers:

... | while IFS=: read freq timeout cmd; do 
    something with "$freq" "$timeout" "$cmd" 
done