Variable über Pipe überprüfen

  • Ersteller blueunderground
  • Erstellt am
blueunderground

blueunderground

Mitglied
grep -A 41870 -e 'store-id="\AM' /file.xml | grep -e \<price-assignment\ product\-id\=\.*02715350000 | cut -f 4 -d '"'



erhalte daraus eine Zahl (10.0), nun möchte ich überprüfen, wenn dieser Wert größer als 5.0 ist z.b "Preis höher" aus geben und wenn diese kleiner als 5.0 ist "Preis kleiner".

so sollte es aussehen:

grep -A 41870 -e 'store-id="\AM' /file.xml | grep -e \<price-assignment\ product\-id\=\.*02715350000 | cut -f 4 -d '"'

Habt ihr ein Vorschlag
Danke
 
Hallo
Hier nur mal schnell mein Lösungsvorschlag, zum selber fertigbasteln. ;)
Schreib dein Konstruct in eine for Schleife und prüfe dort die Variable.
Alternativ kannst du es auch direkt weiter in eine Pipe schieben, wo dahinter ein Test lauert.
Variante 1:
for I in $(deine commandline here); do if [ $I -gt 5 ];\
then echo "$I greater then 5"; elif....;fi; done

Variante 2 überlass ich deiner Phantasie ;)

Gruß Wolfgang
PS Das schreit förmlich nach einer Perl-Lösung, obgleich ich mir die mal verkneife.:D
 
der haken an der sache ist, glaube ich, dass es sich hier um fliesskomma werte handelt. mit denen kommt die shell (also zumindest die bash) selbst nicht klar, daher bietet sich bc dafür an:
Code:
zahl=$( grep -A 41870 -e 'store-id="\AM' /file.xml | grep -e \<price-assignment\ product\-id\=\.*02715350000 | cut -f 4 -d '"')
if (( $(echo "$zahl>5.0"|bc) == 1 )) ; then echo "grösser"; else echo "kleiner"; fi
 
ninguno schrieb:
der haken an der sache ist, glaube ich, dass es sich hier um fliesskomma werte handelt. mit denen kommt die shell (also zumindest die bash) selbst nicht klar, daher bietet sich bc dafür an:
Hallo @ninguno
das mit dem Glauben ist so eine sache, wenn der Fragesteller sein
Problem nicht so richtig klar ausdrückt. ;)
Ein Paar Beispieldaten und nach was gesucht wird, wären da schon hilfreich.
Wahrscheinlich ist ein recht kurzer Perl-Einzeiler weit effizienter.
bcist natürlich eine Möglichkeit.
Das grep-Gebilde davor schaut mir etwas zu heftig aus.
Solang aber keine Rohdaten vorliegen, kann man nur spekulieren.

Ich spekuliere mal, dass das mit einer einzigen sed oder perl
Regexpression filterbar ist. Unter perl ist der Vorteil gegeben, das auch gleich noch auswerten zu können (auch mit Fließkomma!).
Also alles unter einem einzigen Prozess!


Gruß Wolfgang
 
@ninguno
Vielen Dank, genau das suchte ich, vielen Dank!

@ Wolfgang_1
Na klaro auch an Wolfgang ein großes Danke, der hier immer stets mit hervorragenden Ideen auffährt.

@ beide
Asche auf mein Haupt, das nächste Mal gibts mehr Infos :-)


Danke
Blue
 
Hallo
Kleine Anmerkung noch zu @ninguno seiner Variante:
Werte die genau 5.0 sind werden hier auch als kleiner bewertet.
Mathematisch ist das nicht korrekt.
Wenn du die rausfiltern willst, müsstest du statt dessen
elif verwenden und nach kleiner abfragen. wenn beides nicht zutrifft ist es gleich.
Damit kannst du dann mit else weiternachen.

Das nur der Genauigkeit wegen. ;)

Gruß Wolfgang
PS Freu mich (sicher nicht allein) wenn wenigstens Rückmeldungen kommen.
Kandidaten, die sich nur schnell anmelden, ihre Frage abdrücken und danach nimmer mehr gesehen werden, mag ich weniger.
 
zahl=$( grep -A 41870 -e 'store-id="\AM' /file.xml | grep -e \<price-assignment\ product\-id\=\.*02715350000 | cut -f 4 -d '"')
if (( $(echo "$zahl>5.0"|bc) == 1 )) ; then echo "grösser"; else echo "kleiner"; fi

Habe ich eingebunden, es läuft auch soweit, jetzt habe ich nur das Problem, das wenn ich von GREP keinen Wert also nichts als Ergebnis geliefert bekomme, schlägt die IF-Abfrage natürlich fehl.

Fall 1:
grep liefert den Wert 10.0 zurück. ## Das ist ok!

Fall 2:
grep liefert den keine Wert zurück, weil das Statement nichts finden (grep'en) kann ## und nu ?


Mit
if [ "$zahl" -eq "" ]
kann ich nicht arbeiten weil er ja eine Integerzahl erwartet :-(


Danke
Mit
 
Wolfgang_1 schrieb:
...
PS Freu mich (sicher nicht allein) wenn wenigstens Rückmeldungen kommen.
Kandidaten, die sich nur schnell anmelden, ihre Frage abdrücken und danach nimmer mehr gesehen werden, mag ich weniger.

Stimmt, davon gibts leider ziemlich viele :(

Gruss, Phorus

edit: @bug *scnr*

Einfach ein "test -z" vorschalten.
 
Zuletzt bearbeitet:
Hallo
Noch eine Möglichkeit bietet die bash durch Variablenexpansion an.

${var:-default}

Default-Wert setzen, wenn var nicht gesetzt ist.
Die Expansion gibt default zurück wenn var nicht gesetzt ist.
Sonst den Inhalt von var.


Ist var also leer, könntest du dafür einen String einsetzen und darauf testen.
Ist aber nicht besser als if [ -z $var ].
Soll nur als Ergänzung dienen, weil Varablenexpansion in der shell sehr effiziente Möglichkeiten bieten.

echo ${var:?ich bin leer}
Gibt "ich bin leer" aus, und lässt var ungesetzt, und bricht das Script ab - wenn var leer ist -!

Gruß Wolfgang
 
Brauch da noch Verständnishilfe, Wolfgang.
Wie und wo baue ich das nun in mein Skript ein ?

zahl=$( grep -e 'store-id="\AM' /file.xml | grep -e \<price-assignment\ product\-id\=\.*123456 | cut -f 4 -d '"' | if [ test -z "$zahl" = "" ]; then echo "leer" ; else echo "$zahl" ; fi >> ergebnis)

Hintergrund des ganzen, es soll überprüft werden ob der Wert den grep an cut übergibt leer ist, wenn grep keine Ergebnisse findet soll ein "leer" ausgegeben werden, ansonsten der gefundene Wert ($zahl), in diesem Fall der Preis.

Danke
 
blueunderground schrieb:
Brauch da noch Verständnishilfe, Wolfgang.
Wie und wo baue ich das nun in mein Skript ein ?
Code:
zahl=$( grep -e 'store-id="\AM' /file.xml | grep -e \<price-assignment\ product\-id\=\.*123456 | cut -f 4 -d '"' | if [ test -z "$zahl" = "" ]; then echo "leer" ; else echo "$zahl" ; fi >> ergebnis)

Hintergrund des ganzen, es soll überprüft werden ob der Wert den grep an cut übergibt leer ist, wenn grep keine Ergebnisse findet soll ein "leer" ausgegeben werden, ansonsten der gefundene Wert ($zahl), in diesem Fall der Preis.

Danke
Hallo Dein if [ test...] ist total daneben. ;)
die [ repräsentiert das test!
-z $var
prüft ob $var leer ist.
man bash

.. -z string
True if the length of string is zero.

besser
if [ -z $zahl ]; then ...

Gruß Wolfgang
 
Wolfgang_1 schrieb:
...
besser
if [ -z $zahl ]; then ...

Der Vollständigkeit halber, obiges ist gleichwertig mit

Code:
if test -z $zahl; then ...

... nur um den Zusammenhang zwischen [] und test zu zeigen.

Gruss, Phorus
 
Zuletzt bearbeitet:
OK, Danke !
Das es jetzt so einfach war habe ich nicht gedacht.
Das mit [ test -z $var ] statt [ -z $var ] mach ich immer wieder. *nerv*
 
Hallo
Weil wir gerade beim Ergänzen sind ;)
Um auf meine oben genannte (hier nicht so angebrachte) Variante
zurückzukommen:
if [ ${var:?leer} = "leer" ]; then echo "${var:?Ich bin leer}";else echo $var;fi
Man könnte sich also das if Konstrukt sparen, habe es nur zur Verständigung belassen.
Hier macht unter Umständen test Sinn.
test ${var:?leer} = "leer" || echo "${var:?leer}"; hier geht es weiter

gibt den String "leer" zurück, wenn var nicht gesetzt ist und prüft anschließend auf den String "leer".
Ist var gesetzt bleibt es erhalten.
Macht also genau das Gleiche im Ergebnis.

var wird selbst nicht verändert!

Nur der Vollständigkeit halber für Leutz die gerne auf String matchen wollen. ;)
Sinnvoll, weil man gleich Fehlermeldungen damit generiert, ohne diese einer Variablen zuzuweisen.

Gruß Wolfgang
 

Ähnliche Themen

Problem mit HSPA+ Modem Huawei E353 - Installation unmöglich?

Displayport + externer Monitor zeigt bei startx nichts erst bei DVI

eine Schleife einbauen.

Mondorescue über Cron-Job

HP PSC 2175 - CUPS druckt nicht

Zurück
Oben