You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用jq过滤JSON列表以排除多个指定值

解决jq多值属性排除多条记录的问题

要过滤JSON列表,排除Image字段包含指定多个关键词的记录时,单值排除的命令可以正常运行:

  • 匹配包含"rancher"的记录:
    jq -C 'select( .Image | contains("rancher"))'
    
  • 反向排除包含"rancher"的记录:
    jq -C 'select( .Image | contains("rancher")|not)'
    

但扩展到多值排除时,错误的写法会触发报错:
错误命令:

echo $JSON | jq 'select( .Image | contains("rancher")|not or .Image | contains("jenkins")| not)'

报错信息:

jq: error (at :1): boolean (true) and string ("jenkins") cannot have their containment checked
parse error: Expected value before ',' at line 1, column 147

错误原因

该写法的逻辑优先级混乱,contains("rancher")|not得到布尔值后,后续的or运算符错误地将布尔值与后续的字符串操作关联,导致jq尝试对布尔值和字符串执行contains操作,触发类型不匹配错误。同时逻辑本身也有误:要排除包含任意一个关键词的记录,需要的是两个条件同时成立(既不包含rancher,也不包含jenkins),而非or(满足任意一个排除条件即可)。

正确解法

写法1:明确逻辑分组(and连接条件)

用括号明确每个条件的范围,同时用and连接两个反向匹配条件:

echo "$JSON" | jq 'select( (.Image | contains("rancher") | not) and (.Image | contains("jenkins") | not) )'

写法2:用数组+any简化逻辑

将关键词放入判断逻辑,用any检查是否匹配任意关键词,再取反:

echo "$JSON" | jq 'select( any(["rancher", "jenkins"]; .Image | contains(.)) | not )'

写法3:正则匹配(高效简洁)

用test结合正则表达式匹配多个关键词,再取反:

echo "$JSON" | jq 'select( .Image | test("rancher|jenkins") | not )'

这种方式适合关键词较多的场景,只需扩展正则表达式即可。

内容的提问来源于stack exchange,提问作者U.V.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 16:46:17