如何用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数组里是否存在任意元素等于value1input_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
相关产品推荐
相关产品推荐

