Ho un comando che invia i dati a stdout (command1 -p=aaa -v=bbb -i=4
).
La riga di output può avere il seguente valore:
rate (10%) - name: value - 10Kbps
Voglio grep quell'output per memorizzare quella "frequenza" (suppongo che pipe sarà utile qui).
E infine, vorrei che la velocità fosse un valore di un parametro su un secondo comando (diciamo command2 -t=${rate}
)
Sembra essere difficile da parte mia; Vorrei sapere meglio come usare pipe, grep, sed e così via.
Ho provato molte combinazioni come quella ma mi sto confondendo con queste:
$ command1 -p=aaa -v=bbb -i=4 | grep "rate" 2>&1 command2 -t="rate was "${rate}
Risposta accettata:
Stai confondendo due tipi di input molto diversi.
- Input standard (
stdin
) - Argomenti della riga di comando
Questi sono diversi e sono utili per scopi diversi. Alcuni comandi possono ricevere input in entrambi i modi, ma in genere li usano in modo diverso. Prendi ad esempio il wc
comando:
-
Passaggio di input tramite
stdin
:ls | wc -l
Questo conterà le righe nell'output di
ls
-
Passaggio di input tramite argomenti della riga di comando:
wc -l $(ls)
Questo conterà le righe nell'elenco dei file stampato da
ls
Cose completamente diverse.
Per rispondere alla tua domanda, sembra che tu voglia acquisire la velocità dall'output del primo comando, quindi utilizzare la velocità come argomento della riga di comando per il secondo comando. Ecco un modo per farlo:
rate=$(command1 | sed -ne 's/^rate..([0-9]*)%.*/1/p')
command2 -t "rate was $rate"
Spiegazione del sed
:
- Il
s/pattern/replacement/
il comando è quello di sostituire alcuni pattern - Lo schema significa:la riga deve iniziare con "rate" (
^rate
) seguito da due caratteri qualsiasi (..
), seguito da 0 o più cifre, seguito da un%
, seguito dal resto del testo (.*
) 1
nella sostituzione si intende il contenuto della prima espressione catturata all'interno di(...)
, quindi in questo caso le cifre prima del%
firma- Il
-n
bandiera delsed
comando significa non stampare righe per impostazione predefinita. Ilp
alla fine dels///
comando significa stampare la riga se c'è stata una sostituzione. In breve, il comando stamperà qualcosa solo se c'è stata una corrispondenza.