GNU/Linux >> Linux Esercitazione >  >> Linux

Passare l'output del comando precedente al successivo come argomento?

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.

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

  1. Passaggio di input tramite stdin :

    ls | wc -l
    

    Questo conterà le righe nell'output di ls

  2. 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 del sed comando significa non stampare righe per impostazione predefinita. Il p alla fine del s/// comando significa stampare la riga se c'è stata una sostituzione. In breve, il comando stamperà qualcosa solo se c'è stata una corrispondenza.

Linux
  1. Come posso richiamare l'argomento del precedente comando bash?

  2. Come aggiungere l'output a un file?

  3. Come passare l'argomento in Expect tramite la riga di comando in uno script di shell

  4. Come leggere la colonna IDLE nell'output del comando Linux 'w'?

  5. Nascondere l'output di un comando shell solo in caso di successo?

Con Bash dopo "scorrere" fino a un comando precedente ... Come passare quindi al successivo in questa cronologia?

$_ Vs!$. Ultimo argomento del comando precedente e reindirizzamento dell'output?

Cerca testo sull'output del terminale?

Salva l'output di un comando dal terminale Debian in un file

Come passare l'output del comando come più argomenti a un altro comando

Cosa significa il simbolo della pipe Linux | fare?