GNU/Linux >> Znalost Linux >  >> Linux

Předat výstup předchozího příkazu dalšímu jako argument?

Mám příkaz, který odesílá data do stdout (command1 -p=aaa -v=bbb -i=4 ).
Výstupní řádek může mít následující hodnotu:

rate (10%) - name: value - 10Kbps

Chci ten výstup grep, abych si uložil tu 'rychlost' (myslím, že tu bude užitečná roura).
A nakonec bych chtěl, aby ta rychlost byla hodnotou parametru v druhém příkazu (řekněme command2 -t=${rate} )

Z mé strany to vypadá ošidně; Chtěl bych lépe vědět, jak používat trubky, grep, sed a tak dále.

Vyzkoušel jsem spoustu kombinací, jako je tato, ale z těchto jsem zmaten:

$ command1 -p=aaa -v=bbb -i=4 | grep "rate" 2>&1 command2 -t="rate was "${rate}

Přijatá odpověď:

Pletete si dva velmi odlišné typy vstupů.

  1. Standardní vstup (stdin )
  2. Argumenty příkazového řádku

Ty jsou různé a jsou užitečné pro různé účely. Některé příkazy mohou přijímat vstupy oběma způsoby, ale obvykle je používají odlišně. Vezměte si například wc příkaz:

  1. Předání vstupu pomocí stdin :

    ls | wc -l
    

    Tím se spočítají řádky ve výstupu ls

  2. Předání vstupu argumenty příkazového řádku:

    wc -l $(ls)
    

    Tím se budou počítat řádky v seznamu souborů vytištěno ls

Úplně jiné věci.

Chcete-li odpovědět na vaši otázku, zní to tak, že chcete zachytit rychlost z výstupu prvního příkazu a pak použít rychlost jako argument příkazového řádku pro druhý příkaz. Zde je jeden způsob, jak to udělat:

rate=$(command1 | sed -ne 's/^rate..([0-9]*)%.*/1/p')
command2 -t "rate was $rate"

Vysvětlení sed :

  • s/pattern/replacement/ příkaz je nahradit nějaký vzor
  • Vzor znamená:řádek musí začínat „rate“ (^rate ) následované libovolnými dvěma znaky (.. ), za kterým následuje 0 nebo více číslic a za nimi % , za kterým následuje zbytek textu (.* )
  • 1 v nahrazení znamená obsah prvního výrazu zachyceného v (...) , takže v tomto případě číslice před % znamení
  • -n vlajka sed příkaz znamená standardně netisknout řádky. p na konci s/// příkaz znamená vytisknout řádek, pokud došlo k nahrazení. Stručně řečeno, příkaz něco vypíše pouze v případě, že došlo ke shodě.

Linux
  1. Jak získat přístup k poslednímu argumentu komentovaného příkazu?

  2. Jak si mohu vybavit argument předchozího příkazu bash?

  3. Jak předat výstup příkazu jako více argumentů jinému příkazu

  1. Jak předat argument příkazového řádku do skriptu Shell?

  2. Jak číst sloupec IDLE ve výstupu příkazu Linux 'w'?

  3. Skrýt výstup příkazu shellu pouze při úspěchu?

  1. Výstup „posledního“ příkazu?

  2. Jaký je rozdíl mezi získáním výstupu příkazu pomocí `command` a $(command) v Shell?

  3. S Bash po „posouvání“ nahoru k předchozímu příkazu… Jak pak přejít na další v této historii?