0

ec2din webservice の出力から ec2url、サイズ、およびその他の特定のパラメーターを保存する必要があります。

現在、私はこれを行っています

 ec2url=`ec2din ${instance[n]} --region $i | grep INSTANCE | awk '{print($4)}'`
 size=$(ec2din ${instance[n]}  --region $i | grep INSTANCE | awk '{print($9)}')
 comment=$(ec2din ${instance[n]} --region $i | grep TAG | awk '{print($5)($6)($7($8)}';)

ただし、このプロセスでは、スクリプトの実行速度に影響する Web サービスを 3 回実行します。

私が考えることができる1つの方法は、出力をファイルに保存し、そこからforループで読み取ることです

ただし、これを達成するための他の最良の方法があれば教えてください。

4

1 に答える 1

1

最初に出力を変数に保存してから、他のコマンドで再利用します。

output=$(ec2din "${instance[n]}" --region "$i")
ec2url=$(echo "$output" | grep INSTANCE | awk '{print($4)}')
size=$(echo "$output" | grep INSTANCE | awk '{print($9)}')
comment=$(echo "$output" | grep TAG | awk '{print($5)($6)($7($8)}')

そして、実際には grep を除外して awk を使用することもできます。

output=$(ec2din "${instance[n]}" --region "$i")
ec2url=$(echo "$output" | awk '/INSTANCE/{print($4)}')
size=$(echo "$output" | awk '/INSTANCE/{print($9)}')
comment=$(echo "$output" | awk '/TAG/{print($5)($6)($7($8)}')

もう 1 つの方法は、echo を使用する代わりに、ここで文字列を使用することです。

output=$(ec2din "${instance[n]}" --region "$i")
ec2url=$(awk '/INSTANCE/{print($4)}' <<< "$output")
size=$(awk '/INSTANCE/{print($9)}' <<< "$output")
comment=$(awk '/TAG/{print($5)($6)($7($8)}' <<< "$output")

INSTANCE のインスタンスが 1 行だけであると予想される場合は、read を使用してさらに改善できます。

output=$(ec2din "${instance[n]}" --region "$i")
IFS=$'\n' read -rd '' ec2url size < <(awk '/INSTANCE/{print($4 "\n" $9)}' <<< "$output")
comment=$(awk '/TAG/{print($5)($6)($7($8)}' <<< "$output")

また、INSTANCE が TAG の前に表示されることが予想され、一方だけではなく両方が常に存在する可能性がある場合は、すべてを 1 行に入れることができます。

IFS=$'\n' read -rd '' ec2url size comment < <(ec2din "${instance[n]}" --region "$i" | awk '/INSTANCE/{print($4 "\n" $9)};/TAG/{print($5)($6)($7($8)}')
于 2013-08-13T12:53:56.193 に答える