如何用jq高效匹配多值及指定范围的JSON对象?
用jq高效筛选JSON对象的两种场景解法
假设Bash变量中存储了多个JSON对象:
json='{"key":"100"}{"key":"200"}{"key":"300"}'
先回顾基础筛选写法:
- 匹配单个key值:
printf '%s\n' "$json" | jq 'select(.key == "100")'
- 用
or匹配少量多个值:
printf '%s\n' "$json" | jq 'select(.key == "100" or .key == "200")'
一、批量匹配多个key值(替代重复or)
当需要匹配的key值数量较多时,用jq的IN操作符配合数组更简洁高效,把所有目标值放进数组,直接判断key是否属于该数组:
printf '%s\n' "$json" | jq 'select(.key IN ["100", "200", "300"])'
如果目标值需要从外部变量传入,可通过--argjson参数传递数组:
target_values='["100","200"]' printf '%s\n' "$json" | jq --argjson arr "$target_values" 'select(.key IN $arr)'
二、筛选key值在数值范围内的对象
注意示例中的key是字符串类型,需要先用tonumber转换为数值后再做范围判断:
方法1:直接数值比较
printf '%s\n' "$json" | jq 'select((.key | tonumber) >= 99 and (.key | tonumber) <= 201)'
方法2:用between函数简化写法
jq的between(a;b)可直接判断值是否落在[a,b]闭区间内:
printf '%s\n' "$json" | jq 'select((.key | tonumber) | between(99;201))'
内容的提问来源于stack exchange,提问作者fuumind
相关产品推荐
相关产品推荐

