使用jq将AWS JSON输出转换为CSV

时间:2017-04-19 14:53:31

标签: json csv 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中。

提前致谢!

1 个答案:

答案 0 :(得分:0)

如果没有一些实际数据,很难做到很多,但this answera similar question会从

的输出中生成报告
aws ec2 describe-security-groups --group-ids sg-0000001 sg-0000002

也许它可能会有所帮助。