如何使用jq数组值返回true

时间:2019-03-20 02:59:30

标签: arrays json jq any

如果列表中任一条件为true,则我尝试使用以下jq命令返回true输出。

.Tags[] as $t| "aws:cloudformation:stack-name"| IN($t[])   

输入

 {
    "Tags": [{
            "Value": "INF-D-XX-SEC-OPNV-UW1",
            "Key": "Name"
        },
        {
            "Value": "INF-D-XX-CFS-StandardInfrastructure-UW1",
            "Key": "aws:cloudformation:stack-name"
        },
        {
            "Value": "sgOpenVPNAccess",
            "Key": "aws:cloudformation:logical-id"
        },
        {
            "Value": "UW1",
            "Key": "Location"
        },
        {
            "Value": "INF",
            "Key": "Application"
        },
        {
            "Value": "D",
            "Key": "Parent Environment"
        },
        {
            "Value": "arn:aws:cloudformation:us-west-1:111111:stack/INF-D-XX-CFS-StandardInfrastructure-UW1/1111-11-11e8-96fe-11",
            "Key": "aws:cloudformation:stack-id"
        },
        {
            "Value": "OPNV",
            "Key": "ResourceType"
        }
    ]
}

这给了我以下返回的布尔值列表,

-输出-

true
false
false
false
false
false
false

如果其中一个

,我想返回一个值true
Key="aws:cloudformation:stack-name" 

被检测到并且没有给我返回值列表。

4 个答案:

答案 0 :(得分:2)

借助any/2,很容易实现非常高效的解决方案(在时间和空间方面):

any(.Tags[]; .Key == "aws:cloudformation:stack-name")

这当然评估为truefalse。如果您只想使用true或什么都不想要,可以将// empty附加到上面。

答案 1 :(得分:0)

一个解决方案    从.tags构建一个布尔数组,然后使用 any 汇总所有布尔

jq '.Tags | map( .Key == "aws:cloudformation:stack-name" ) |  any ' 

答案 2 :(得分:0)

如果您愿意使用替代方法,这也是一个简单的方法(基于Unix实用程序 jtc ):

bash $ <file.json jtc -w'[Key]:<^aws:cloudformation:stack-name$()>R' -T'true{$1}'
true
bash $ <file.json jtc -w'[Key]:<^blah$()>R' -T'true{$1}'
bash $ 

一个小技巧是:执行RE匹配,同时使用假/空组(在RE的末尾),只需确保在成功匹配后插入模板的插值即可。

答案 3 :(得分:0)

基于@peak的前一个答案,因为不能发表评论,所以可以将'-e'标志用于jq来设置退出状态,从而可以轻松地将Shell命令链接在一起。这样可以避免测试返回的字符串。

jq -e 'any(.Tags[]; .Key == "aws:cloudformation:stack-name")' json >/dev/null && echo 'Exists' || echo 'Missing'