如何用jq检测JSON中指定元素存在并输出目标值列表?
问题描述
给定如下JSON:
{ "environment": [ { "name": "AAA", "value": "1111" }, { "name": "BBB", "value": "2222" }, { "name": "CCC", "value": "3333" }, { "name": "DDD", "value": "4444" } ] }
需求:
- 当
environment数组中存在name为"CCC"的元素时,单行输出指定的value值(比如输出1111, 2222, 4444,或者1111, 2222, 3333) - 若不存在"CCC"元素,则不输出任何内容
目前已写出的jq命令:
jq -r '.environment[] | select (.name == "CCC") | [.name, .value] | @csv'
但不知道如何编写逻辑来输出其他目标value值,寻求帮助。
解决方案
场景1:输出指定名称对应的value(例如AAA、BBB、DDD的value)
先判断CCC是否存在,再筛选指定name的元素,提取value后拼接成单行:
jq -r 'if (.environment | any(.name == "CCC")) then (.environment[] | select(.name == "AAA" or .name == "BBB" or .name == "DDD") | .value) | join(", ") else empty end'
执行后输出:1111, 2222, 4444
场景2:输出所有元素的value(包含CCC)
判断CCC存在后,提取所有value并拼接:
jq -r 'if (.environment | any(.name == "CCC")) then (.environment[] | .value) | join(", ") else empty end'
执行后输出:1111, 2222, 3333, 4444
场景3:输出除CCC外所有元素的value
判断CCC存在后,筛选排除CCC的元素并提取value:
jq -r 'if (.environment | any(.name == "CCC")) then (.environment[] | select(.name != "CCC") | .value) | join(", ") else empty end'
执行后输出:1111, 2222, 4444
命令逻辑说明
any(.name == "CCC"):检查environment数组中是否存在name为CCC的元素,返回布尔值if ... then ... else empty end:条件分支,满足条件则执行输出逻辑,否则输出空内容select(...):筛选符合条件的数组元素.value:提取元素的value字段join(", "):将提取到的value数组用逗号加空格拼接成单行字符串
内容的提问来源于stack exchange,提问作者TomC
相关产品推荐
相关产品推荐

