Shell脚本嵌套While循环及Ksh解析JSON文件问题求助
用Korn Shell解析JSON的靠谱方案
嘿,我看你正在尝试用Ksh脚本结合sed、awk这类文本工具解析JSON,但这种做法其实挺脆弱的——JSON的格式灵活性很高(比如嵌套结构、空格换行的变化),很容易让你的正则匹配失效,遇到复杂结构时脚本会变得难维护还容易出错。
原脚本的问题
你的脚本依赖硬编码的字符串替换(比如把}}}}换成换行)和正则匹配提取字段,但只要JSON的键值对多了个空格、字段顺序变了,甚至嵌套层级调整,你的sed/cut命令就可能提取不到正确内容,容错性极差。
更可靠的选择:用jq专门处理JSON
jq是一款专为JSON设计的轻量级命令行工具,它能准确理解JSON的结构,不管格式怎么变化都能精准提取字段,几乎所有Linux发行版都可以通过包管理器安装(比如yum install jq或apt install jq)。
针对你的样本JSON结构({"results":[{"general-info":{"full-name":"TELOS MANAGEMENT","body":{"party":{"xrefs":{"xref...),假设你要从results数组的每个对象中提取general-info.full-name和对应的id(你可以根据实际字段位置调整路径),用jq的脚本会简洁很多:
#!/bin/ksh # 用jq解析JSON,提取full-name和id字段,输出指定格式 jq -r '.results[] | "\(.general-info."full-name")|\(.body.party.xrefs.id)"' /var/tmp/Cloud_test.txt
命令解释
-r:让jq输出原始字符串(不带引号),方便后续处理.results[]:遍历results数组中的每一个元素\(.general-info."full-name"):提取嵌套字段general-info下的full-name(因为字段名含连字符,需要用引号包裹)- 用
|分隔两个字段,输出格式和你原脚本的"${firstname}'|'${id}"一致
如果没法用jq怎么办?
如果你的环境确实无法安装jq,建议用支持JSON解析的脚本语言(比如Python、Perl)处理,比如用Python的json模块:
#!/bin/ksh python3 -c ' import json with open("/var/tmp/Cloud_test.txt") as f: data = json.load(f) for item in data["results"]: full_name = item["general-info"]["full-name"] id_val = item["body"]["party"]["xrefs"]["id"] # 替换为实际的id字段路径 print(f"{full_name}|{id_val}") '
这种方法比sed/awk稳定得多,能正确处理JSON的各种格式变化。
内容的提问来源于stack exchange,提问作者user7392087
相关产品推荐
相关产品推荐

