2017-10-04 1 views
0

Ich habe gerade diesen Fehler beim Versuch, meinen Code neu zu schreiben.grep & wget im Konflikt über Variable

Dieser Code funktioniert wie erwartet:

#XML downloading 
wget -q http://192.168.50.154/details.xml -O details.xml 

#load XML in Variable 
rohxml=details.xml 

#Read Data and save to Variable 
health=$(grep '<Health' $rohxml | cut -f2 -d">"|cut -f1 -d"<") 

Aber wenn ich versuche, es auf eine Variable direkt zu speichern (weil ich nicht eine neue Datei in dem neuen Server speichern kann) wirft mir die folgende Fehlermeldung:

grep: invalid option -- 'O' Usage: grep [OPTION]... PATTERN [FILE]... Try 'grep --help' for more information.

Dies ist der "neue" Code:

#load XML in Variable 
ABFRAGE="'wget -q -O- http://192.168.50.154/details.xml'" 
rohxml=$ABFRAGE 

#Read Data and save to Variable 
health=$(grep '<Health' $rohxml | cut -f2 -d">"|cut -f1 -d"<") 
+0

Sie kennen Sie den wget Kommandozeile in einer Variablen sind zu speichern und dann die Ausführung auf die grep-Befehlszeile, anstatt die Ausgabe des Befehls in einer Variablen zu speichern, oder? Tu das nicht - dafür gibt es Funktionen. Wie beschrieben, stellen Sie sich selbst bösen Überraschungen aus, wenn Sie es aus bestimmten Verzeichnissen usw. ausführen, da Sie Ihren Befehl der Shell für Wildcard-Erweiterung, Globbing, Wortteilung usw. offen legen. –

+0

Fügen Sie nicht "Gelöst" hinzu der Titel. Um anzuzeigen, dass Ihre Frage beantwortet wurde, akzeptieren Sie eine Antwort (in der Regel möchten Sie diese ebenfalls verbessern). Wenn keine der vorhandenen Antworten Ihr Problem gelöst hat, können Sie selbst eine Antwort posten und akzeptieren. –

Antwort

0

Sie haben einige grundlegende Missverständnisse, wie Shell funktioniert. Versuchen Sie Folgendes:

rohxml="$(wget -q -O- 'http://192.168.50.154/details.xml')" 
health="$(awk -F'[<>]' '/<Health/{ print $3 }' <<<"$rohxml")" 
printf 'health="%s"\n' "$health" 

und dann fragen, wenn Sie Fragen haben. Ich nehme an, Sie einige Verwendung für die Variablen haben rohxml und health über den Code, den Sie sonst gebucht alles, was Sie brauchen, ist:

wget -q -O- 'http://192.168.50.154/details.xml' | 
awk -F'[<>]' '/<Health/{ print $3 }' 
2

Sie die Zeichenfolge gespeichert

'wget -q -O- http://192.168.50.154/details.xml' 

in der $ roxml Variable, nicht die Ausgabe des Befehls. Verwenden Sie backquotes, um die Ausgabe zu speichern.

Verwenden Sie außerdem ein XML-Tool, um Informationen aus XML zu extrahieren. Für einfache Abfragen sollte xmllint gut genug funktionieren.

+0

Jetzt habe ich ABFRAGE = "' wget -q -O- http: // 192.168.50.154/details.xml' " Aber jetzt ist es nicht die Befehle korrekt analysieren (ich bekomme Fehler von den anderen XML-Sachen, die ich ' mre nicht durch grep) – MrPoPoPolski

+1

@MrPoPoPolski Sie müssen stattdessen 'var = $ (command)' 'verwenden. Außerdem sollten Sie die Variable in Anführungszeichen in Ihrem 'grep'-Befehl einschließen – Aaron

0

Ich schrieb gerade meinen Code wieder und jetzt nur noch die folgenden verwenden und es funktioniert gut

wget -O - -o /dev/null http://192.168.50.154/details.xml | sed -n 's:.*<Health>\(.*\)</Health>.*:\1:p'