使用jq解析json输出以获取特定属性作为新的json输出

时间:2017-06-06 21:18:37

标签: amazon-web-services unix aws-cli jq

我是jq的新手,我正在尝试解析我从命令获得的输出json -

aws cloudformation list-stacks --stack-status-filter CREATE_COMPLETE

获取新的输出,其中键的值与特定模式匹配。

例如,这是我之前命令的json输出 -

{
  "StackSummaries": [
    {
      "StackId": "arn:aws:213dqwqwdqwdqwdq",
      "StackName": "monkeyman",
      "CreationTime": "2017-06-06T20:52:59.728Z",
      "StackStatus": "CREATE_COMPLETE",
      "TemplateDescription": "Liaison API ELB cloud formation script"
    },
    {
      "StackId": "arn:aws:csdfsdfcsdfsdfsdfsdfsdfgdfgfdg",
      "StackName": "monkeyman2",
      "CreationTime": "2017-06-06T20:51:55.191Z",
      "StackStatus": "CREATE_COMPLETE",
      "TemplateDescription": "yoohooo instance"
    },
    {
      "StackId": "arn:aws:sdffgds444fsdfsdfgdfgfdg",
      "StackName": "starfish2",
      "CreationTime": "2017-06-06T20:51:55.191Z",
      "StackStatus": "CREATE_COMPLETE",
      "TemplateDescription": "helloworld instance"
    },
    {
      "StackId": "arn:aws:csdfsdfcsdfsdfsdfsdfsdfgdfgfdg",
      "StackName": "bulldog4",
      "CreationTime": "2017-06-06T20:51:55.191Z",
      "StackStatus": "CREATE_COMPLETE",
      "TemplateDescription": "night night instance"
    },
    {
      "StackId": "arn:aws:yhyhyhyhyhysdfgdfgfdg",
      "StackName": "carrotman",
      "CreationTime": "2017-06-06T20:51:55.191Z",
      "StackStatus": "CREATE_COMPLETE",
      "TemplateDescription": "surprise mo instance"
    }

  ]

}

这里我需要通过将第一个输出传递给jq来创建一个新的输出json,其中StackName的开始是 monkeyman bulldog ,它应该看起来像 -

{
  "StackSummaries": [
    {
      "StackId": "arn:aws:213dqwqwdqwdqwdq",
      "StackName": "monkeyman",
      "CreationTime": "2017-06-06T20:52:59.728Z",
      "StackStatus": "CREATE_COMPLETE",
      "TemplateDescription": "Liaison API ELB cloud formation script"
    },
    {
      "StackId": "arn:aws:csdfsdfcsdfsdfsdfsdfsdfgdfgfdg",
      "StackName": "monkeyman2",
      "CreationTime": "2017-06-06T20:51:55.191Z",
      "StackStatus": "CREATE_COMPLETE",
      "TemplateDescription": "yoohooo instance"
    },
    {
      "StackId": "arn:aws:csdfsdfcsdfsdfsdfsdfsdfgdfgfdg",
      "StackName": "bulldog4",
      "CreationTime": "2017-06-06T20:51:55.191Z",
      "StackStatus": "CREATE_COMPLETE",
      "TemplateDescription": "night night instance"
    }

  ]

}

我已经尝试了很多,我能够以某种方式使用基本的unix split和regex命令来做这件事,但有些东西告诉我直接使用jq会更简单,也不那么麻烦。

1 个答案:

答案 0 :(得分:2)

使用jq

可以轻松
jq '.[] |= map(select(.StackName | startswith("monkeyman"), startswith("bulldog")))'

简而言之,map(x)将x应用于提供给它的每个对象。 select(y)选择满足条件y的对象。在这种情况下,条件y是有一个名为StackName的键,其值以“monkeyman”或“bulldog”开头。