Tugas pertama adalah mengekstraksi kurs dari baris itu. Dengan GNU grep (Linux yang tidak tertanam atau Cygwin), Anda dapat menggunakan -o
opsi ini. Bagian yang Anda inginkan adalah bagian yang hanya mengandung digit, dan diikuti oleh %
tanda. Jika Anda tidak ingin mengekstraksi %
sendiri, Anda perlu trik tambahan: pernyataan lookahead lebar nol , yang tidak cocok dengan apa pun kecuali hanya jika tidak ada yang diikuti %
.
command1 -p=aaa -v=bbb -i=4 | grep -o -P '[0-9]+(?=%)'
Kemungkinan lain adalah menggunakan sed. Untuk mengekstrak bagian dari baris dalam sed, gunakan s
perintah, dengan regex yang cocok dengan seluruh baris (dimulai dengan ^
dan diakhiri dengan $
), dengan bagian untuk mempertahankan dalam grup ( \(…\)
). Ganti seluruh baris dengan konten grup yang ingin dipertahankan. Secara umum, berikan -n
opsi untuk mematikan pencetakan default dan letakkan p
pengubah untuk mencetak garis di mana ada sesuatu untuk diekstraksi (di sini ada satu baris sehingga tidak masalah). Lihat Mengembalikan hanya sebagian dari garis setelah pola yang cocok dan Mengekstrak regex yang cocok dengan 'sed' tanpa mencetak karakter di sekitarnya untuk trik sed yang lebih banyak.
command1 -p=aaa -v=bbb -i=4 | sed 's/^.*rate(\([0-9]*\)%).*$/\1/'
Lebih fleksibel lagi daripada sed, awk. Awk menjalankan instruksi untuk setiap baris dalam bahasa imperatif kecil. Ada banyak cara untuk mengekstraksi kurs di sini; Saya memilih bidang kedua (bidang dibatasi oleh spasi putih secara default), dan menghapus semua karakter di dalamnya yang bukan angka.
command1 -p=aaa -v=bbb -i=4 | awk '{gsub(/[^0-9]+/, "", $2); print $2}'
Langkah selanjutnya, sekarang setelah Anda mengekstraksi kurs, adalah meneruskannya sebagai argumen command2
. Alat untuk itu adalah susbtitusi perintah . Jika Anda memasukkan perintah ke dalam $(…)
(dolar-kurung), hasilnya diganti ke baris perintah. Output dari perintah dibagi menjadi kata-kata yang terpisah di setiap blok spasi, dan setiap kata diperlakukan sebagai pola wildcard; kecuali jika Anda ingin ini terjadi, menempatkan tanda kutip ganda sekitar substitusi perintah: "$(…)"
. Dengan tanda kutip ganda, output dari perintah digunakan secara langsung sebagai parameter tunggal (satu-satunya transformasi adalah bahwa baris baru di akhir output dihapus).
command2 -t "$(command1 -p=aaa -v=bbb -i=4 |
sed 's/^.*rate(\([0-9]*\)%).*$/\1/')"