我为标题道歉我不知道如何描述我想要做的事情,所以我将通过代码解释。
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
}
答案 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}"