终端下如何从大型JSON文件中提取指定关键字及其对应数据
终端下如何从大型JSON文件中提取指定关键字及其对应数据
碰到超大JSON文件确实头疼,编辑器直接卡爆太闹心了!你之前用grep没得到想要的结果很正常——grep本质是处理纯文本,对JSON这种结构化数据完全不“理解”,加上大文件用cat全读进内存,直接刷屏也在所难免。
给你推荐几个靠谱的解决办法,都是终端里就能搞定的:
首选:用jq(JSON处理神器)
jq是专门为终端处理JSON设计的工具,流式处理大文件完全不卡,而且能精准定位结构化数据。
先确保你装了
jq:- Debian/Ubuntu系:
sudo apt install jq - macOS:
brew install jq - 其他系统可以通过对应包管理器安装,一般都有支持。
- Debian/Ubuntu系:
提取所有
OutputResults字段的值:
如果不管OutputResults在JSON的哪个层级,只要出现就提取它的值,用这个命令:jq '..|.OutputResults? // empty' thefile.json简单解释下:
..:递归遍历JSON的所有节点.OutputResults?:尝试获取每个节点下的OutputResults字段,?表示没有该字段时不报错// empty:没找到这个字段就跳过,避免输出冗余内容
如果想连字段名一起输出(保留
"OutputResults": {...}格式):jq '..|objects|select(has("OutputResults"))|{OutputResults: .OutputResults}' thefile.json这样输出的每个结果都是完整的键值对结构,更直观。
备选:用Python脚本(无需额外工具)
如果你的环境没法装jq,Python几乎是系统自带的,写个小脚本就能搞定:
普通版(适合内存能装下整个文件)
import json def find_output_results(obj): # 递归遍历所有节点找OutputResults if isinstance(obj, dict): if "OutputResults" in obj: yield obj["OutputResults"] for value in obj.values(): yield from find_output_results(value) elif isinstance(obj, list): for item in obj: yield from find_output_results(item) with open("thefile.json", "r") as f: data = json.load(f) for result in find_output_results(data): # 格式化输出,看起来更清晰 print(json.dumps(result, indent=2))
把这段代码存成extract_json.py,然后运行:
python extract_json.py
流式版(应对超大内存的极端情况)
如果文件大到内存都装不下,用ijson库流式读取(需要先安装:pip install ijson):
import ijson import json with open("thefile.json", "r") as f: # 流式遍历所有OutputResults字段 for result in ijson.items(f, "..OutputResults"): print(json.dumps(result, indent=2))
这个版本不会把整个文件读进内存,再多的内容也能平稳处理。
为啥之前的grep不行?
你用grep -A 4的时候,JSON的结构可能不是固定的4行,而且大文件用cat会一次性把整个文件输出,自然会刷屏。grep没法识别JSON的层级关系,所以抓不到精准的对应数据,还是用专门的JSON工具更靠谱。
备注:内容来源于stack exchange,提问作者KansaiRobot
相关产品推荐
相关产品推荐

