jq是Linux解析JSON最可靠工具,替代易崩的sed/awk;需用-jq -e严格模式、set -e脚本防护、curl -sf校验HTTP状态,并处理空数组、缺失字段及类型转换。

Linux下用jq解析JSON最可靠
别折腾sed或awk硬切JSON字段——结构稍一变化就崩,还容易被嵌套引号、转义字符、换行搞崩溃。Linux原生没内置JSON解析器,jq是事实标准,轻量、稳定、语法清晰,几乎所有发行版都能一键装上。
实操建议:
- Debian/Ubuntu:
sudo apt install jq;CentOS/RHEL:sudo yum install jq或sudo dnf install jq - 确认可用:
jq --version,输出类似jq-1.6即可 - 临时测试不写脚本:把API返回存成
response.json,直接跑jq '.data.items[0].name' response.json
Shell脚本里安全调用jq提取字段
重点不是“怎么写”,而是“怎么防错”:网络请求失败、JSON格式非法、字段不存在,都会让jq静默输出空或报错,脚本却继续往下跑,结果不可控。
实操建议:
- 用
set -e让脚本在任何命令失败时退出(加在脚本开头) - 用
jq -e启用严格模式:当查询路径不存在时返回非零退出码,配合||捕获异常 - 始终用双引号包裹
jq表达式,避免shell变量扩展干扰,例如:jq -r ".items[] | select(.id == $target_id) | .name" data.json - 提取单值推荐加
-r(raw output),否则带引号的字符串会多一层转义
处理curl返回的JSON响应体要先判断HTTP状态
很多人直接curl ... | jq '.status',但若API返回404或502,curl默认仍输出错误页HTML或空响应,jq会报parse error或吐出空,而脚本完全不知情。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
实操建议:
- 加
-f参数让curl对非2xx响应报错(触发set -e退出) - 加
-s静默错误信息,避免混入JSON流;用-w "\n%{http_code}"末尾追加状态码,再用head -n-1切掉它 - 更稳妥做法:先存临时文件,用
file response.tmp检查是否为JSON,再交给jq - 示例片段:
response=$(curl -sf -w "\n%{http_code}" "https://api.example.com/data" | { read body; read code; if [ "$code" = "200" ]; then echo "$body"; else echo "HTTP $code" >&2; exit 1; fi; })
jq常见坑:空数组、缺失字段、数字和字符串混淆
API返回结构常有不确定性,比如.results可能是[]、null,或干脆没这个key;又比如"count": 123和"count": "123"在jq里类型不同,==比较会失败。
实操建议:
- 查数组长度统一用
length,不管是不是空:jq '.data.items | length' - 判空字段用
//提供默认值:jq '.user.name // "unknown"' - 强制转数字用
| tonumber,转字符串用| tostring,避免隐式转换陷阱 - 遍历可能为空的数组,用
.items[]?(问号表示“如果存在才展开”),比.items[]更健壮
实际写脚本时,最易忽略的是错误分支覆盖——不是所有API都按规范返回JSON,也不是所有环境都预装jq,得提前检查命令是否存在、输入是否合法、字段是否真有值。这些判断看着啰嗦,但少一行,线上就可能丢一条关键数据。










