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ů.
- Standardní vstup (
stdin
) - 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:
-
Předání vstupu pomocí
stdin
:ls | wc -l
Tím se spočítají řádky ve výstupu
ls
-
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
vlajkased
příkaz znamená standardně netisknout řádky.p
na koncis///
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ě.