CentOS 6.x
2つの完全に異なる文字列のcurl、grepから出力を取得し、それぞれの値を変数として割り当てたいと思います。 (出力をディスクに書き込まずに)これを行う最も効率的な方法は何ですか?
通常、次のようなスクリプトを作成することを考えます。
#!/usr/bin/env bash
foo1=$(curl https://domain.com/file.xml | grep string1)
foo2=$(curl https://domain.com/file.xml | grep string2)
しかし、これは2つのパスを取得することになり、恐ろしく非効率的です。もっと良い方法はありますか?うまくいけば、より少ないパスを含むソリューションですか?
これを試して:
_foo1=$(curl https://domain.com/file.xml | grep -E "string1|string2")
_
これにより、curl
が1回実行され、_string1
_または_string2
_が出現した場合にgrepが実行されます。
それらが異なる変数である場合は、戦術を少し変更します。 curl
の出力をキャプチャし、その後grep
をキャプチャします。
_output=$(curl https://domain.com/file.xml)
foo1=$(echo "$output" | grep "string1")
foo2=$(echo "$output" | grep "string2")
_
結果を個別の変数ではなく配列に格納することもできます。
_output=$(curl https://domain.com/file.xml)
readarray foo < <(echo "$output" | grep "string1|string2")
_
「string2」からの結果が配列の最初または2番目の項目である可能性があるため、grepからの結果が結果を返さない可能性がある場合、これは少し扱いにくいですが、ここでは、単なる例として示します。アプローチ。
プロセス置換(<( ..cmd..)
)とともにread
コマンドを使用するさらに別のメソッド。
_$ read -d"\n" foo1 foo2 \
<(curl https://domain.com/file.xml | grep -E "string1|string2")
_
「string1」の検索で何も返されず、「string2」の一致が_$foo1
_に表示される場合は、これも注意が必要です。また、このアプローチは、上記の#2または#3よりも移植性が低くなる傾向があります。
read var1 var2 <<CURLSED
$(curl $url | sed -nr 's/(regx1)\|(regx2)/"\1"'"$IFS"'"\2"/p')
CURLSED
しかし、真剣に、この猫の皮をむく方法は100万通りあります。