首页/系统/Linux 运维命令速查/场景:接口 JSON 字段提取
文本处理77 条

场景:接口 JSON 字段提取

调接口排障的标准组合:curl -sS 拉 JSON,jq -r 抽字段;HTTP 错误也要把状态码和响应体分开看。

Linux 运维命令速查系统更新于 2026-10-13

这条路径解决什么

调接口排查与取数时,标准组合是 curl 负责取、jq 负责解析:curl -sS 静默但保留错误、-o 把响应体落盘、-w 单独取状态码,jq 用路径表达式抽出需要的字段。把「状态码」与「响应体」分开处理,是这类脚本可靠的关键——很多问题其实是网关返回了 HTML 错误页而不是 JSON。

基本信息

适用场景从接口响应里提取字段、做巡检与数据核对
核心工具curl -sS -o 文件 -w 格式、jq -r 输出原始字符串
退出码约定curl -f 让 HTTP 4xx 与 5xx 返回非零;jq 解析失败也返回非零
常用选项jq -r 去引号、-c 紧凑输出、-e 让结果为空时返回非零
前置检查先落盘原始响应,再解析;避免边取边解析导致现场丢失

典型使用场景

  • 健康巡检:取 status 字段判断服务是否正常
  • 数据核对:从接口拉列表,用 jq 转成制表符分隔再交给 column 对齐
  • 排障取证:先把响应体与状态码一起存档,再离线分析
  • 批量校验:对一批接口循环取值,统计异常项
  • 与监控对接:把接口返回的数值转成监控可直接消费的格式

基础提取

基础提取
curl -sS -o /tmp/r.json -w '%{http_code}\n' https://api.example.com/health   # 状态码与响应体分开
curl -sSf -o /tmp/r.json https://api.example.com/health                        # HTTP 错误直接非零退出
jq -r '.data.host, .data.uptime' /tmp/r.json                                   # 抽多个字段
jq -r '.items[] | [.id, .name, .status] | @tsv' /tmp/r.json | column -t         # 列表转表格
jq -e '.status == "ok"' /tmp/r.json > /dev/null                                # 作为脚本判据

jq 常用表达式

表达式作用注意
​.data.host按路径取值键不存在时返回 null,不是报错
​.items[]迭代数组元素对 null 迭代会报错,先判空
​select(.x > 1)按条件过滤常与数组迭代组合使用
​@tsv 与 @csv转成制表符或 CSV配 -r 使用,便于 column 对齐
​// 默认值左边为 null 时取右边用于补齐缺失字段
​to_entries把对象转成键值对数组适合遍历未知键名
-e按结果决定退出码脚本里判断条件是否成立
curl -f 让 HTTP 状态码大于等于 400 时返回非零退出码,脚本判断成功失败比解析状态码更可靠;-sS 组合表示静默进度但保留错误信息,是脚本里的推荐写法。
管道里 jq 失败会被后面的命令掩盖:curl 的失败状态被丢弃,最终退出码来自管道最后一个命令。脚本开头加 set -o pipefail,才能让中间环节的失败真正暴露出来。
解析前先摸清结构:jq type 判断顶层是对象还是数组,jq keys 看有哪些字段名。字段名里含连字符、点号或空格时,点号语法不成立,要改用 .["field-name"] 这种带方括号与引号的写法。

易错点

  • 返回内容不是 JSON(网关错误页、登录跳转页)时 jq 直接报解析错误,先看 -o 落盘的原始响应
  • 字段是字符串形式的数字时,参与运算前要用 tonumber,否则 jq 会按字符串处理报错
  • 不加 set -o pipefail 时管道中 jq 的失败会被忽略,脚本误判为成功
  • 对可能为 null 的字段直接迭代会报错,先判空或用 // 给默认值
  • 响应体很大时全部读进内存再解析会占资源,必要时用 --stream 做流式处理

数据来源与参考

  • man 1 jq(jq 1.7 手册)
  • man 1 curl

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌