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数组excludertrimstr("\n"):去除每行末尾的换行符,避免匹配时出现问题
额外排查点
- 先单独执行
kubectl get svc -n default -o json,确认输出是标准的包含items数组的JSON(比如空服务时输出{"items":[]}),排除kubectl本身的输出问题。 - 检查
input.txt是否存在空行或特殊字符,必要时先清理文件内容。
内容的提问来源于stack exchange,提问作者Donislav Belev
相关产品推荐
相关产品推荐

