Ich habe einen Befehl, der Daten an stdout ausgibt (command1 -p=aaa -v=bbb -i=4
).
Die Ausgabezeile kann folgenden Wert haben:
rate (10%) - name: value - 10Kbps
Ich möchte diese Ausgabe grep, um diese "Rate" zu speichern (ich denke, Pipe wird hier nützlich sein).
Und schließlich möchte ich, dass diese Rate ein Wert eines Parameters für einen zweiten Befehl ist (sagen wir command2 -t=${rate}
)
Auf meiner Seite scheint es schwierig zu sein; Ich würde gerne besser wissen, wie man Pipes, grep, sed und so weiter benutzt.
Ich habe viele Kombinationen wie diese ausprobiert, aber diese verwirren mich:
$ command1 -p=aaa -v=bbb -i=4 | grep "rate" 2>&1 command2 -t="rate was "${rate}
Akzeptierte Antwort:
Sie verwechseln zwei sehr unterschiedliche Arten von Eingaben.
- Standardeingabe (
stdin
) - Befehlszeilenargumente
Diese sind unterschiedlich und für unterschiedliche Zwecke nützlich. Einige Befehle können Eingaben auf beide Arten annehmen, verwenden sie jedoch normalerweise unterschiedlich. Nehmen Sie zum Beispiel wc
Befehl:
-
Eingabe durch
stdin
übergeben :ls | wc -l
Dadurch werden die Zeilen in der Ausgabe von
ls
gezählt -
Eingabe durch Befehlszeilenargumente übergeben:
wc -l $(ls)
Dadurch werden Zeilen in der Dateiliste gezählt gedruckt von
ls
Ganz andere Dinge.
Um Ihre Frage zu beantworten, klingt es so, als ob Sie die Rate aus der Ausgabe des ersten Befehls erfassen und dann die Rate als Befehlszeilenargument für den zweiten Befehl verwenden möchten. Hier ist eine Möglichkeit, das zu tun:
rate=$(command1 | sed -ne 's/^rate..([0-9]*)%.*/1/p')
command2 -t "rate was $rate"
Erklärung des sed
:
- Die
s/pattern/replacement/
Befehl ist, ein Muster zu ersetzen - Das Muster bedeutet:Die Zeile muss mit „Rate“ beginnen (
^rate
) gefolgt von zwei beliebigen Zeichen (..
), gefolgt von 0 oder mehr Ziffern, gefolgt von einem%
, gefolgt vom restlichen Text (.*
) 1
in der Ersetzung bedeutet den Inhalt des ersten in(...)
erfassten Ausdrucks , also in diesem Fall die Ziffern vor dem%
unterschreiben- Das
-n
Flag dessed
Befehl bedeutet, dass standardmäßig keine Zeilen gedruckt werden. Dasp
am Ende dess///
Befehl bedeutet, die Zeile zu drucken, wenn es einen Ersatz gab. Kurz gesagt, der Befehl gibt nur dann etwas aus, wenn es eine Übereinstimmung gab.