如何查询对象数组的多个字段?

时间:2019-04-18 21:41:11

标签: jq aws-cli

我正在根据以下json查询AWS CLI输出。

{
"Aliases": [
    {
      "AliasName": "alias/ab1",
      "AliasArn": "arn:aws:kms:eu-west-1:123:alias/key1",
      "TargetKeyId": "66"
    },
    {
      "AliasName": "alias/ab2",
      "AliasArn": "arn:aws:kms:eu-west-1:123:alias/key2",
      "TargetKeyId": "77"
    },
    {
      "AliasName": "alias/ab3",
      "AliasArn": "arn:aws:kms:eu-west-1:123:alias/key3",
      "TargetKeyId": "88"
    },
    {
      "AliasName": "alias/ab4",
      "AliasArn": "arn:aws:kms:eu-west-1:123:alias/aws/key4",
      "TargetKeyId": "99"
    }
  ]
}

有查询

.Aliases[] | (.AliasArn | select(contains(":alias/aws/") | not) ) 

但这仅拉出AliasArn字段,也需要TargetKeyId。关于如何同时使用这两个字段的任何想法?

"arn:aws:kms:eu-west-1:123:alias/key1"
"arn:aws:kms:eu-west-1:123:alias/key2"
"arn:aws:kms:eu-west-1:123:alias/key3"

3 个答案:

答案 0 :(得分:1)

字符串插值将对此有效。

我直接称为AWS CLI list-aliases,并将其通过管道传输到jq,使用选择/包含过滤器,并使用String Interpolation通过管道进行输出。

aws kms list-aliases |jq -r '.Aliases[] |select (.AliasArn |contains(":alias/aws/") | not) | "AliasArn: \(.AliasArn)\t\tTargetKeyId: \(.TargetKeyId)"'

为便于阅读,我在输出中添加了几个标签。

参考

https://stedolan.github.io/jq/manual/

答案 1 :(得分:0)

谢谢Kenlukas,他的头上钉了钉子。

我做了一些细微的改进,只捕获了别名描述以及如此处所示的键-

aws kms list-aliases |jq -r '.Aliases[] |select (.AliasArn |contains(":alias/aws/") | not) | "AliasArn: \(.AliasArn | split("/")[1])\t\tTargetKeyId: \(.TargetKe yId)"'

答案 2 :(得分:0)

您非常接近解决方案。您只需要添加要添加到过滤器中的字段:

.Aliases[]|select(.AliasArn|contains(":alias/aws")|not) |.AliasArn,.TargetKeyId