2017-06-06 44 views
1

我很新的JQ,我试图解析输出JSON我从命令得到 -使用JQ分析JSON输出以获得特定性质的新的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" 
    } 

    ] 

} 

在这里,我需要通过管道第一输出,以便创建一个新的输出JSON来JQ其中StackName startsWith monkeyman斗牛犬和应该像 -

{ 
    "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分裂和正则表达式的命令,但东西告诉我它禾使用jq直接做起来更容易,也更简单。

+0

亚马逊原生支持。我们不需要'jq'来实现这一点。请参阅此链接:http://opensourceconnections.com/blog/2015/07/27/advanced-aws-cli-jmespath-query/它解释了如何实现此目的。 –

回答

2

容易JQ

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

概括地说,图(x)的适用x到被馈送到它的每一个对象。选择(y)选择满足条件y的对象。在这种情况下,条件y是有一个名为StackName的键,其值以“monkeyman”或“bulldog”开头。

+0

这已经解决了我的问题,真棒。 – Shek