如何组合来自 AWS cli 结果的不同节点的多个属性?

How do I combine multiple attributes from different nodes of an AWS cli result?

我收到来自 AWS CLI 命令的 JSON 响应,如下所示:

[
    {
        "AmiLaunchIndex": 0,
        "ImageId": "ami-03ededff12e34e59e",
        "InstanceId": "i-01e625ed10dadda91",
        "InstanceType": "t2.micro",
        "LaunchTime": "2022-04-18T02:35:03+00:00",
        "Monitoring": {
            "State": "disabled"
        },
        "Tags": [
            {
                "Key": "Name",
                "Value": "Some Server"
            }
        ]
    }
]

如何提取实例 ID 和标签名称,使其打印如下:

Instance ID: i-01e625ed10dadda91
Name: Some Server

到目前为止我已经试过了

jq '.[] | "Instance ID: \(.InstanceId) 
Tag Name: \(.Tags[0].Value)"'

但是一旦有多个标签或标签不存在,它就会崩溃。

如果您想将多个标签连接在一起并生成一个结果,请将它们以 CSV 格式组合在一起,如下所示

jq --raw-output '.[] | 
  "Instance ID: \(.InstanceId)\nTag Name: \( .Tags | map(select(.Key == "Name").Value) |join(","))"'

注意在原始输出模式下打印时扩展到换行符的内插字符串序列中包含 \n 字符。

jqplay demo - 1

如果您想跳过打印 Name 字段,以防它为空,则需要添加更多逻辑

jq --raw-output '.[] | 
  "Instance ID: \(.InstanceId)" as $x | 
  ( .Tags | map(select(.Key == "Name") ) ) as $y | 
  if ( $y | length ) > 0 then 
    $x + "\nName: \( $y | map(.Value) | join(",") )" 
  else $x end'

jqplay demo - 2