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 -lTí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 (.*) 1v nahrazení znamená obsah prvního výrazu zachyceného v(...), takže v tomto případě číslice před%znamení-nvlajkasedpříkaz znamená standardně netisknout řádky.pna 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ě.