Как я могу запросить несколько полей массива объектов?

#jq #aws-cli

#jq #aws-cli

Вопрос:

Я запрашиваю выходные данные AWS CLI в соответствии с приведенным ниже json.

 {
"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"
 

Ответ №1:

Для этого будет работать интерполяция строк.

Я вызываю интерфейс командной строки AWS list-aliases напрямую и передаю его по jq каналу, использую фильтр select / contains и передаю его по каналу, используя интерполяцию строк для вывода.

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

Я добавил пару вкладок в вывод для удобства чтения.

Ссылки

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

Комментарии:

1. @sweeny_here если это помогло вам решить вашу проблему, не могли бы вы пометить ее как принятую, чтобы все знали, что ваша проблема решена.

Ответ №2:

Спасибо, Кенлукас, это попало в самую точку.

Я внес небольшое уточнение, чтобы просто записать описание псевдонима вместе с ключом, как показано здесь —

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

Ответ №3:

Вы очень близки к решению. Вам просто нужно добавить поле, которое вы хотите получить в своем фильтре:

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