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


8

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

回答:


10

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

これを試して:

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

これはcurl1回実行され、string1またはの出現に対してgrepを実行しstring2ます。

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から変数に読み込む

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

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

「string1」の検索で何も返されず、「string2」に一致するものがに表示される場合は、これもまたトリッキーです$foo1。また、このアプローチは、上記の#2または#3よりも移植性が低い傾向があります。


ごめんなさい!入力ミスがありました。変数は実際には異なります。:-(概要が更新されるようになりました。
マイクB

推奨するプロセス置換は、移植可能なオプションとはほど遠いことに注意してください。
mikeserv 2014年

@mikeserv-フィードバックをありがとう、更新。
slm

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.