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 之类的函数可以很好地处理这个问题。

但是,由于您还尝试检索不在此标记数组中的值,因此您可以稍微不同地处理它以节省一些步骤。使用reduceforeach,您可以浏览每个标签并将其添加到包含您感兴趣的所有值的对象中。然后您可以将所需的值映射到数组中,然后转换为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

好消息是,如果标签数组中不存在NameClientCostCenter,甚至不存在InstanceId,那么它们将只是null,当转换为 csv。

【讨论】:

以上是关于AWS CLI / jq - 使用标签转换 JSON,甚至显示未定义标签的信息的主要内容,如果未能解决你的问题,请参考以下文章

AWS CLI过滤器OR逻辑

AWS-CLI:如何过滤自动缩放组

描述 EC2 实例 使用 AWS cli 过滤实例名称

使用 cloudformation 在 AWS ECR 中指定标签不变性

使用 AWS CLI 或 Python 增加自动扩展组中的实例数

重命名使用 AWS cli 生成的用于 beanstalk 部署的战争