Apa cara paling efisien untuk memahami dua hal yang sepenuhnya terpisah dan menetapkan nilai ke variabel yang terpisah?

8

CentOS 6.x

Saya ingin mengambil output dari curl, grep untuk dua string yang benar-benar terpisah, dan menetapkan nilai masing-masing sebagai variabel. Apa cara paling efisien untuk melakukan ini (tanpa menulis output ke disk)?

Biasanya saya akan berpikir memiliki skrip dengan sesuatu seperti:

#!/usr/bin/env bash
foo1=$(curl https://domain.com/file.xml | grep string1)
foo2=$(curl https://domain.com/file.xml | grep string2)

Tapi ini akhirnya mengambil dua operan dan sangat tidak efisien. Apakah ada cara yang lebih baik? Semoga solusi yang melibatkan lebih sedikit operan?

Mike B
sumber

Jawaban:

10

1. Masuk ke dalam 1 variabel

Coba ini:

foo1=$(curl https://domain.com/file.xml | grep -E "string1|string2")

Ini akan berjalan curl1 kali dan menerima kejadian string1atau string2.

2. Memahami 2 variabel

Jika mereka variabel yang berbeda maka ubah sedikit taktik. Tangkap output dari curldan kemudian grepsesudahnya.

output=$(curl https://domain.com/file.xml)
foo1=$(echo "$output" | grep "string1")
foo2=$(echo "$output" | grep "string2")

3. Grepping ke dalam array

Anda juga bisa menyimpan hasil dalam array bukan variabel yang terpisah.

output=$(curl https://domain.com/file.xml)
readarray foo < <(echo "$output" | grep "string1|string2")

Yang ini agak sulit untuk ditangani jika hasil Anda dari grep mungkin tidak mengembalikan hasil, karena hasil dari "string2" mungkin item pertama atau kedua dalam array, tapi saya menyediakannya di sini hanya sebagai demonstrasi dari pendekatan.

4. Membaca ke dalam vars dari grep

Namun metode lain yang memanfaatkan readperintah bersama dengan proses substitusi ( <( ..cmd..)).

$ read -d"\n" foo1 foo2 \
   <(curl https://domain.com/file.xml | grep -E "string1|string2")

Ini lagi bisa rumit jika pencarian "string1" tidak menghasilkan apa-apa, menyebabkan kecocokan untuk "string2" muncul di $foo1. Juga pendekatan ini cenderung kurang portabel daripada # 2 atau # 3 di atas.

slm
sumber
Maaf! Saya salah ketik. Variabelnya sebenarnya berbeda. :-( Ringkasan sekarang diperbarui.
Mike B
Anda mungkin ingin mencatat bahwa proses substitusi yang Anda rekomendasikan jauh dari opsi portabel.
mikeserv
@ mikeserv - terima kasih atas umpan baliknya, diperbarui.
slm
3
read var1 var2 <<CURLSED
$(curl $url | sed -nr 's/(regx1)\|(regx2)/"\1"'"$IFS"'"\2"/p')
CURLSED

Tapi serius, kawan, ada jutaan cara untuk menguliti kucing ini.

mikeserv
sumber