[英]Converting AWS JSON output to CSV using jq
我正在研究将我的AWS安全组和实例结合在一起的脚本,因此我可以拥有一个类似Excel / CSV格式的合并列表:
Security Groups | Security Group Name | Instances | Rules | Source
SG1 | GroupName | Instance1 | :80 | 0.0.0.0\0
| | Instance2 | :443 | 0.0.0.0\0
请注意,我是jq的新手,真的只是在黑暗中摸索。
我使用一系列API调用和jq格式化数据,但最后一个字符串的格式为平面json。
我的剧本:
#!/bin/bash
### Get ALL data for all Instances
all_instances=$(aws ec2 describe-instances \
--query 'Reservations[].Instances[]' \
--profile dev)
### Get Only the Instance ID's
instanceids=$(aws ec2 describe-instances \
--query 'Reservations[].Instances[].InstanceId' \
--output text \
--profile dev)
### Get all data from Security Groups
all_securitygroups="$(aws ec2 describe-security-groups --profile dev)"
### Match the Instances to the SG's, and pull the IP Rules as well
for instance in $instanceids; do
instance_sgids=$(echo $all_instances|jq -r "map(select(.InstanceId == \"$instance\"))[].SecurityGroups[].GroupId")
for sg in $instance_sgids; do
rules=$(echo $all_securitygroups|jq -r "map(select(.[].GroupId == \"$sg\"))[]" )
### Convert that silly Json to beautiful csv...
newrules=$(echo $rules|jq --compact-output --raw-output '{SGID: .[].GroupId, Description: .[].Description,Protocol: .[].IpPermissions[].IpProtocol, Port: .[].IpPermissions[].FromPort, CIDR: .[].IpPermissions[].IpRanges[].CidrIp} | flatten | @csv')
#flattenrules=$(echo $rules|jq -r [{ .Description } + (IpPermissions[] | { FromPort } + (IpRanges[] | {CidrIp}))])
echo "SecurityGroup, Name, Port, Source" > ~/Documents/output.csv
echo "$newrules" | sort | uniq >> ~/Documents/output.csv
done
done
这让我如此接近,但是我似乎无法弄清最后一站。 我有实例ID,现在我拥有所有SG信息。 我的问题现在正在寻找一种以上述格式输出的方法...
我知道我可能缺少一些简单的东西,但是如果您有任何jq / shell专家可以为我指明正确的方向,那我将不胜感激。 我在这里看到了其他问题,这些问题提到使用Perl和其他语言,但是我真的很想把它保留在jq / shell中。
提前致谢!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.