AWS CLI / jq - 使用标签转换 JSON,甚至显示未定义标签的信息
Posted
技术标签:
【中文标题】AWS CLI / jq - 使用标签转换 JSON,甚至显示未定义标签的信息【英文标题】:AWS CLI / jq - transforming JSON with tags, and showing information even for non-defined tags 【发布时间】:2018-10-12 07:22:38 【问题描述】:我在尝试使用“jq”处理“aws ec2 describe-instances”命令的输出时遇到问题,我真的需要一些帮助。
我想将 JSON 输出转换为包含所有实例列表的 CSV 文件,其中 列“名称、InstanceId、Tag-Client、Tag-CostCenter”。
我一直在使用 jq 的 select 和类似的命令:
aws ec2 describe-instances |
jq -r '.Reservations[].Instances[]
| (.Tags[]|select(.Key=="Name")|.Value) + "," + .InstanceId + ","
+ (.Tags[]|select(.Key=="Client")|.Value) + ","
+ (.Tags[]|select(.Key=="CostCenter")|.Value)'
但是以这种方式使用选择,只显示那些包含所有标签的条目,而不显示那些只包含一个标签的条目。
我理解这种行为,它类似于 grep,但我试图弄清楚是否可以使用 jq 执行此操作,因此在未定义一个标签的情况下,将只返回字符串“”而不是删除整行。
我找到了有关在 jq 中使用“if”子句的参考([https://ilya-sher.org/2016/05/11/most-jq-you-will-ever-need/],但想知道是否有人已经解决了这种情况,而无需制定此逻辑或在不同的执行中拆分命令。
【问题讨论】:
看起来你可以使用类似'(select(...)|.Value) // ""'的东西。请尽可能遵循 mcve 指南,以便给出更明确的答案:***.com/help/mcve 【参考方案1】:当你得到一个键/值对数组(这里的标签)并且你想通过它们的键提取值时,将它们映射到一个对象中会更容易,这样你就可以直接访问它们。 from_entries
之类的函数可以很好地处理这个问题。
但是,由于您还尝试检索不在此标记数组中的值,因此您可以稍微不同地处理它以节省一些步骤。使用reduce
或foreach
,您可以浏览每个标签并将其添加到包含您感兴趣的所有值的对象中。然后您可以将所需的值映射到数组中,然后转换为csv行。
因此,如果您的目标是为每个实例创建 Tags[Name], InstaceId, Tags[Client], Tags[CostCenter]
行,您可以这样做:
# for each instance
.Reservations[].Instances[]
# map each instance to an object where we can easily extract the values
| reduce .Tags[] as $t (
InstanceId ; # we want the InstanceId from the instance
.[$t.Key] = $t.Value # add the values to the object
)
# map the desired values to an array
| [ .Name, .InstanceId, .Client, .CostCenter ]
# convert to csv
| @csv
好消息是,如果标签数组中不存在Name
、Client
或CostCenter
,甚至不存在InstanceId
,那么它们将只是null
,当转换为 csv。
【讨论】:
以上是关于AWS CLI / jq - 使用标签转换 JSON,甚至显示未定义标签的信息的主要内容,如果未能解决你的问题,请参考以下文章
使用 cloudformation 在 AWS ECR 中指定标签不变性