GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Übergeben Sie die Ausgabe des vorherigen Befehls als Argument an den nächsten?

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.

  1. Standardeingabe (stdin )
  2. 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:

  1. Eingabe durch stdin übergeben :

    ls | wc -l
    

    Dadurch werden die Zeilen in der Ausgabe von ls gezählt

  2. 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 des sed Befehl bedeutet, dass standardmäßig keine Zeilen gedruckt werden. Das p am Ende des s/// 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.

Linux
  1. Wie weist man die Ausgabe eines Befehls einer Shell-Variablen zu?

  2. Befehlszeilenargumente an Bash-Skript übergeben?

  3. Die Ausgabe eines Befehls in `time Command` umleiten?

  4. Mit Bash nach dem „Scrollen“ zu einem vorherigen Befehl … Wie kann man dann zum nächsten in dieser Geschichte übergehen?

  5. Wie übergibt man die Ausgabe eines Befehls als Argument an einen anderen?

Text auf der Terminalausgabe suchen?

Speichern Sie die Ausgabe eines Befehls vom Debian-Terminal in einer Datei

So übergeben Sie ein Argument in Expect über die Befehlszeile in einem Shell-Skript

So übergeben Sie die Befehlsausgabe als mehrere Argumente an einen anderen Befehl

Was bedeutet das Linux-Pipe-Symbol | tun?

Wie liest man die IDLE-Spalte in der Ausgabe des Linux-Befehls „w“?