如何在单独的变量中存储ec2din的特定输出

时间:2013-08-13 12:42:32

标签: bash amazon-web-services

我需要在ec2din webservice的输出中存储ec2url,size和其他一些特定参数。

目前我正在通过

这样做
 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次,这会影响脚本的执行速度

我能想到的一种方法是将输出存储在一个文件中并从那里读取for循环

但请告诉我是否有其他最好的方法可以实现这一目标。

1 个答案:

答案 0 :(得分: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)}')

另一种方法是在这里使用字符串而不是使用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的实例预计只有一行,您可以通过阅读进一步改进:

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")

如果期望在TAG之前看到INSTANCE并且两者都可以存在,而不仅仅是其中一个,那么你可以将所有内容都放在一行:

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