Saya memiliki perintah yang mengeluarkan data ke stdout (command1 -p=aaa -v=bbb -i=4
).
Baris keluaran dapat memiliki nilai berikut:
rate (10%) - name: value - 10Kbps
Saya ingin mengambil output itu untuk menyimpan 'rate' itu (saya kira pipa akan berguna di sini).
Dan akhirnya, saya ingin rate itu menjadi nilai parameter pada perintah kedua (katakanlah command2 -t=${rate}
)
Tampaknya rumit di pihak saya; Saya ingin tahu lebih baik bagaimana menggunakan pipa, grep, sed dan sebagainya.
Saya sudah mencoba banyak kombinasi seperti itu tetapi saya bingung dengan ini:
$ command1 -p=aaa -v=bbb -i=4 | grep "rate" 2>&1 command2 -t="rate was "${rate}
Jawaban yang Diterima:
Anda membingungkan dua jenis input yang sangat berbeda.
- Masukan standar (
stdin
) - Argumen baris perintah
Ini berbeda, dan berguna untuk tujuan yang berbeda. Beberapa perintah dapat menerima input dengan dua cara, tetapi biasanya menggunakannya secara berbeda. Ambil contoh wc
perintah:
-
Melewati input dengan
stdin
:ls | wc -l
Ini akan menghitung baris dalam output
ls
-
Melewati input dengan argumen baris perintah:
wc -l $(ls)
Ini akan menghitung baris dalam daftar file dicetak oleh
ls
Hal yang sama sekali berbeda.
Untuk menjawab pertanyaan Anda, sepertinya Anda ingin menangkap laju dari output perintah pertama, lalu menggunakan laju sebagai argumen baris perintah untuk perintah kedua. Inilah salah satu cara untuk melakukannya:
rate=$(command1 | sed -ne 's/^rate..([0-9]*)%.*/1/p')
command2 -t "rate was $rate"
Penjelasan dari sed
:
s/pattern/replacement/
perintahnya adalah mengganti beberapa pola- Artinya polanya:baris harus diawali dengan “rate” (
^rate
) diikuti oleh dua karakter (..
), diikuti dengan 0 digit atau lebih, diikuti dengan%
, diikuti oleh teks lainnya (.*
) 1
dalam penggantian berarti konten ekspresi pertama yang ditangkap dalam(...)
, jadi dalam hal ini digit sebelum%
tanda-n
benderased
perintah berarti tidak mencetak baris secara default.p
di akhirs///
perintah berarti mencetak baris jika ada penggantinya. Singkatnya, perintah akan mencetak sesuatu hanya jika ada kecocokan.