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

如何用jq在JSON数组中找到指定值时输出文件名?

解决jq筛选JSON文件并输出文件名的问题

错误原因

你遇到的file_name/0 is not defined错误,是因为jq里根本没有file_name这个内置变量,要获取当前处理的文件名,得用jq官方提供的input_filename变量。另外你之前的表达式逻辑也有问题,应该先判断整个JSON对象是否满足条件,再输出文件名,而不是先提取tags数组再处理。

正确解决方案

方案1:用jq内置变量input_filename

直接通过jq的表达式判断数组是否包含目标值,满足条件时输出文件名:

# 简洁写法:匹配tags数组中等于value1的元素
jq -r 'select(.data.tags[] == "value1") | input_filename' *.json

# 更严谨的写法:用any函数判断数组是否存在匹配项(适合复杂匹配场景)
jq -r 'select(any(.data.tags[]; . == "value1")) | input_filename' *.json
  • -r参数:让jq输出原始字符串(不带引号),保证文件名格式干净
  • select(...):筛选出满足条件的JSON对象
  • any(.data.tags[]; . == "value1"):检查tags数组里是否存在任意元素等于value1
  • input_filename:jq内置变量,返回当前正在处理的文件名

方案2:结合shell循环判断

如果你的jq版本较老(不支持input_filename),可以用shell循环逐个处理文件,通过jq的退出码判断是否满足条件:

for file in *.json; do
  # -e选项:当jq表达式返回true时,退出码为0;否则为非0
  if jq -e 'any(.data.tags[]; . == "value1")' "$file" >/dev/null; then
    echo "$file"
  fi
done
  • >/dev/null:丢弃jq的输出内容,只关注退出码状态
  • 当条件满足时,通过echo输出当前文件名

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 03:07:07