jq - как создать вывод, включающий значения поля, окружающие двойные кавычки - PullRequest
1 голос
/ 06 мая 2020

Фон

Приведенная ниже команда создает поток JSON.

aws cloudformation describe-stacks --stack-name ${stack} --region us-east-1 |\
jq --arg STACK ${stack} '.Stacks[] | select(.StackName=="mlai-metadata-development-backend") | .Outputs[] | select(.ExportName != null) 
{
  "OutputKey": "outputvpcid",
  "OutputValue": "vpc-d4520cb1",
  "Description": "VPC ID of the Stack mlai-metadata-development-backend",
  "ExportName": "stack-vpc-id"
}
{
  "OutputKey": "outputvpccidr",
  "OutputValue": "172.31.0.0/16",
  "Description": "VPC CIDR of the Stack mlai-metadata-development-backend",
  "ExportName": "stack-vpc-cidr"
}

Мне нравится создавать JSON словарь, например {"stack-vpc-cidr": "172.31.0.0/16"}.

Выполнение этого:

aws cloudformation describe-stacks --stack-name ${stack} --region us-east-1 |\
jq --arg STACK ${stack} '.Stacks[] | select(.StackName=="mlai-metadata-development-backend") | .Outputs[] | select(.ExportName != null) | "\(.ExportName):\(.OutputValue)"'

создает.

"stack-vpc-id:vpc-d4520cb1"
"stack-vpc-cidr:172.31.0.0/16"

Вопрос

Как я могу превратить их в строки словаря JSON с помощью jq?


Обновление

Благодаря ответам все поняли правильно.

aws cloudformation describe-stacks --stack-name ${stack} --region ${AWS_DEFAULT_REGION} |\
jq --arg stack ${stack} \
  '[.Stacks[] | select(.StackName==$stack) | .Outputs[] |
  select(.ExportName != null) | { (.ExportName) : (.OutputValue) }] |
  add' |\
tee "${stack}".json

Результат:

{
  "apigw-rest-api-conntent-metadata-url": "https://****.execute-api.us-east-1.amazonaws.com/development/",
  "apigw-rest-api-conntent-metadata-stage-name": "development",
  "stack-availability-zones": "us-east-1a,us-east-1b,us-east-1c,us-east-1d,us-east-1e,us-east-1f",
  "apigw-rest-api-conntent-metadata-deployment-id": "***0tk",
  "stack-vpc-id": "vpc-d4520cb1",
  "stack-vpc-cidr": "172.31.0.0/16"
}

Ответы [ 2 ]

3 голосов
/ 06 мая 2020

Для вашей непосредственной проблемы на последнем прыжке вы можете просто сделать ниже, что делает интерполяцию строки , в jq

{ "\(.ExportName)" : "\(.OutputValue)" }

, но вы можете просто сделать это ниже, выполнив явные имена k / v

{ (.ExportName) : (.OutputValue) }
1 голос
/ 06 мая 2020

Я [хотел бы] создать JSON словарь

Чтобы создать единственный словарь из потока:

jq -n 'reduce inputs as $i (null;
  . + ($i|{ (.ExportName) : (.OutputValue) }))'

Или вы можете изменить свой jq, чтобы использовать аналогичный фрагмент в строках:

[ .Stacks[] .... 
 | { (.ExportName) : (.OutputValue) } ]
| add
...