根据输出从单个命令设置多个Array类型变量

时间:2016-06-03 02:12:19

标签: arrays bash amazon-web-services awk

我为标题道歉我不知道如何描述我想要做的事情,所以我将通过代码解释。

read a b <<<$(`ec2-describe-instances --region $REGION | awk '/SECURITY_ROLE/ { print $2 "\n" $5 }'`)

不幸的是,这不是我需要做的全部..从那里我需要取两个数组并将它们叠加到一个关联数组中。

我可能会使用循环来执行此操作。但主要问题是上面的命令。

使用read a b <<<$(command)它不会设置数组。在输出为a 1 b 2的情况下,最终结果如下:

# echo ${a[0]}
a
# echo ${a[1]}

# echo ${b[0]}
1 b 2
# echo ${b[1]}

#

正如您所看到的,如果内容大于变量的数量,它不会循环回添加到数组中的变量(尽管它不关心数组)。

如果我使用readarray命令,我仍然没有收到所需的输出。

我想要的输出是......(其中c是从a和b创建的关联数组)

# for i in `echo ${a[*]}` ; do echo ${c[$i]} ; done
1
2

在我创建的脚本中,我需要能够使用awk中的$5值从awk调用$2值而无需运行ec2-describe-instances命令。一次(需要很长时间)。

修改

我无法得到理想的解决方案......我确定它出现在某个地方,但是经过大约两天的搜索后,我最终得到了由A.Danischewski启发的肮脏的解决方案。

readarray HA_NODE_DIRECTORY < <(ec2-describe-instances --region $REGION | \
                                awk '/HA_Monitor/ { print $2, $5 }')
readarray HA_NODE_LIST < <(OIFS=$IFS
                           IFS=$'\n'
                           for i in ${HA_NODE_DIRECTORY[@]}
                           do 
                               echo $i | awk '{ print $1 }'
                           done
                           IFS=$OIFS)

使用另一个脏函数将它们绑定在一起而不是干净的字典/关联数组

function find_hostname {
    ID=$1
    OIFS=$IFS
    IFS=$'\n'
    for i in ${HA_NODE_DIRECTORY[@]}
    do 
        echo $i | awk -v x=$ID '$0 ~ x { print $2 }'
    done
    IFS=$OIFS
}

1 个答案:

答案 0 :(得分:1)

我不确定ec2-describe-instances --region $REGION | awk '/SECURITY_ROLE/ { print $2 "\n" $5 }'输出是什么,但看起来你想要数组中的结果。

您可以使用read -a设置数组:
 read -d'\n' -a a < <(printf "Field1 Field2_%s\n" {1..10})

$ echo ${a[2]}
Field1

$ echo ${a[3]}
Field2_2

对于两个阵列:

unset a b && tmpfile="/tmp/_arr2tmp_$$_" 
printf "Field1 Field2_%s\n" {1..10} > "${tmpfile}"
read -d'\n' -a a < <(awk '{print $1}' "${tmpfile}")
read -d'\n' -a b < <(awk '{print $2}' "${tmpfile}")
echo "First three values of a: ${a[1]},${a[2]},${a[3]}"
echo "First three values of b: ${b[1]},${b[2]},${b[3]}"
rm "${tmpfile}"