我有一个AWS环境,我需要安全组的json配置文件。我已经考虑过找到GroupID
,然后用ID来创建文件。从这里我想将创建的文件传递给一个数组并使用命令;
aws ec2 describe-security-groups --group-ids $<name> > $<name>.json
创建n
个json文件。我使用了另一篇帖子https://unix.stackexchange.com/questions/70934/bash-reading-txt-file-and-storing-in-array将文件内容读入数组。我需要的是现在使用上面的命令来创建json文件。
我认为它是在[[ ${a[$i-1]} = $name ]] && echo "${a[$i]}"
完成的,但我不确定,因为我不太了解数组......
#!/bin/bash
# get security-group id's from aws and create a file
aws ec2 describe-security-groups | grep -i groupid | sort -bdu > sg-names-unsorted.txt
# clear leading/trailing text so only sg's remain & cleanup
cat sg-names-unsorted.txt | sed 's/^[ \t]*//;s/[ \t]*$//' > output.txt
cat output.txt | sed 's/\"GroupId": "//;s/"\t*$//' > sg-names.txt
rm sg-names-unsorted.txt output.txt
IFS=$'\n' a=($(cat sg-names.txt))
for i in $(seq ${#a[*]}); do
[[ ${a[$i-1]} = $name ]] && echo "${a[$i]}"
done
#aws ec2 describe-security-groups --group-ids $name > $name.json
答案 0 :(得分:4)
假设您在sg-names.txt
中有一个组名,每行一个名称,您可以使用mapfile
内置命令(可用since bash 4.0
)将这些名称加载到索引数组中,然后循环的简单for
循环:
#!/bin/bash
mapfile groups < sg-names.txt
for group in "${groups[@]}"; do
echo "Processing group: $group"
aws ec2 describe-security-groups --group-ids "$group" > "$group.json"
done
如果您的系统上没有mapfile
,则可以使用read
和while
循环的组合:
#!/bin/bash
while read group; do
echo "Processing group: $group"
aws ec2 describe-security-groups --group-ids "$group" > "$group.json"
done < sg-names.txt
为了简化(并使其更强大)脚本的第一部分(从JSON响应中解析组名),您可以使用jq
而不是脆弱的grep
/ {{1} } combo。
例如,在sed
到位的情况下,您的脚本会显示:
jq