web-dev-qa-db-ja.com

2つの完全に異なるものをgrepし、値を別々の変数に割り当てる最も効率的な方法は何ですか?

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つのパスを取得することになり、恐ろしく非効率的です。もっと良い方法はありますか?うまくいけば、より少ないパスを含むソリューションですか?

8
Mike B

1. 1つの変数に取り組む

これを試して:

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

これにより、curlが1回実行され、_string1_または_string2_が出現した場合にgrepが実行されます。

2. 2つの変数に取り組む

それらが異なる変数である場合は、戦術を少し変更します。 curlの出力をキャプチャし、その後grepをキャプチャします。

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

3.アレイへの進入

結果を個別の変数ではなく配列に格納することもできます。

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

「string2」からの結果が配列の最初または2番目の項目である可能性があるため、grepからの結果が結果を返さない可能性がある場合、これは少し扱いに​​くいですが、ここでは、単なる例として示します。アプローチ。

4. grepから変数に読み込む

プロセス置換(<( ..cmd..))とともにreadコマンドを使用するさらに別のメソッド。

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

「string1」の検索で何も返されず、「string2」の一致が_$foo1_に表示される場合は、これも注意が必要です。また、このアプローチは、上記の#2または#3よりも移植性が低くなる傾向があります。

10
slm
read var1 var2 <<CURLSED
$(curl $url | sed -nr 's/(regx1)\|(regx2)/"\1"'"$IFS"'"\2"/p')
CURLSED

しかし、真剣に、この猫の皮をむく方法は100万通りあります。

3
mikeserv