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

Bash中jq传递多词列表给contains函数失败求助

解决建议

先排查报错根源

这个错误的核心是jq接收到的输入不是预期的包含items数组的JSON结构,大概率是你传递关键词的方式错误,导致jq优先处理了input.txt的文本内容,而非kubectl输出的服务JSON。

正确的命令写法

假设input.txt中每行一个需要排除的关键词(示例内容:

something
otherthing
anotherkeyword

),可以用以下两种方式实现需求:

方法1:将关键词转为JSON数组后传入

# 把input.txt的关键词转换成jq可识别的JSON数组
EXCLUDE_KEYWORDS=$(jq -R . input.txt | jq -s .)
# 执行kubectl + jq组合命令
kubectl get svc -n default -o json | jq --argjson exclude "$EXCLUDE_KEYWORDS" '.items | map(select(.metadata.name | any($exclude[]; contains(.)) | not)) | length'
  • jq -R . input.txt:把每行关键词转成标准JSON字符串
  • jq -s .:将所有字符串合并为一个JSON数组
  • --argjson exclude:把JSON数组传给jq变量exclude,确保jq能正确识别为数组类型
  • 核心逻辑:筛选出名称不包含数组中任何关键词的服务,最后统计数量

方法2:直接用jq读取关键词文件

如果你的jq版本支持--slurpfile参数(绝大多数现代版本都支持),可以简化为:

kubectl get svc -n default -o json | jq --slurpfile exclude input.txt '.items | map(select(.metadata.name | any($exclude[] | rtrimstr("\n"); contains(.)) | not)) | length'
  • --slurpfile exclude input.txt:直接把input.txt的内容按行读入jq数组exclude
  • rtrimstr("\n"):去除每行末尾的换行符,避免匹配时出现问题

额外排查点

  1. 先单独执行kubectl get svc -n default -o json,确认输出是标准的包含items数组的JSON(比如空服务时输出{"items":[]}),排除kubectl本身的输出问题。
  2. 检查input.txt是否存在空行或特殊字符,必要时先清理文件内容。

内容的提问来源于stack exchange,提问作者Donislav Belev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 20:56:08