Bash脚本中从同目录JSON提取指定服务关联条目至数组
处理超大无换行JSON:提取关联服务的主标题
我太懂你这种困境了——面对几千条无换行的JSON条目,用grep硬写正则根本搞不定结构化的关联匹配,要么误抓要么漏抓,头都大了对吧?别纠结文本工具了,用专门的JSON处理工具才是正确打开方式,这里给你两个靠谱的方案:
方案一:用jq(首选,命令行高效处理)
jq是专门为JSON设计的命令行工具,天生支持压缩(无换行)的JSON,不用先格式化就能直接处理,完美适配你的场景。
核心命令
假设你的JSON文件是data.json,要搜索服务标题为STitle5的条目,提取对应的主标题(优先title,其次id_name,最后enttitle):
jq -r '.[] | select(.services[]?.title == "STitle5") | .title // .id_name // .enttitle' data.json
命令拆解
.[]:遍历JSON里的所有顶级条目(因为你的数据是条目数组)select(.services[]?.title == "STitle5"):筛选出services数组中存在任意一个服务title等于目标值的条目;?.是可选链式调用,避免services为null时报错.title // .id_name // .enttitle:jq的默认值运算符,依次尝试取title、id_name、enttitle,哪个存在用哪个-r:输出原始字符串(不带JSON引号),方便存入bash数组
存入bash数组
如果要把结果直接存入bash数组,直接把命令结果赋值即可:
target_titles=($(jq -r '.[] | select(.services[]?.title == "STitle5") | .title // .id_name // .enttitle' data.json))
之后可以用echo "${target_titles[@]}"查看数组内容,或者循环处理每个元素。
方案二:用Python脚本(适合无jq环境或复杂逻辑)
如果你的系统没法安装jq,或者需要更复杂的自定义逻辑,用Python的json模块处理也很稳妥:
编写提取脚本extract_service_titles.py
import json # 目标服务标题 TARGET_SERVICE = "STitle5" result_list = [] # 读取并解析JSON文件(支持无换行格式) with open("data.json", "r", encoding="utf-8") as f: try: items = json.load(f) for item in items: # 遍历当前条目的所有服务 for service in item.get("services", []): if service.get("title") == TARGET_SERVICE: # 按优先级取主标题 main_title = item.get("title") or item.get("id_name") or item.get("enttitle") if main_title: result_list.append(main_title) break # 找到匹配服务就停止当前条目检查 except json.JSONDecodeError as e: print(f"JSON解析错误:{e}") # 输出结果(每行一个标题,方便bash捕获) for title in result_list: print(title)
在bash中调用并存入数组
target_titles=($(python extract_service_titles.py))
为什么grep搞不定?
JSON是结构化数据,字段顺序不固定、嵌套层级多,grep这类文本工具只能做字符串匹配,没法理解结构关系。比如当主标题和服务标题之间隔着大量其他字段时,正则根本没法准确关联两者,很容易匹配到无关内容,尤其无换行的情况下,正则复杂度会爆炸,完全不适合这种场景。
内容的提问来源于stack exchange,提问作者CSA
相关产品推荐
相关产品推荐

