输出结构化是什么
结构化处理指把批量执行的自由文本输出转成有固定字段、能被程序稳定判读的数据。正确顺序是:先让被调用的工具自己输出机器可读格式(很多工具支持 --format json、-o json、--porcelain),再用 jq 之类的解析器取值;只有确实拿不到结构化输出时,才退化为按定界符或列位置解析,并且要把解析规则依赖的格式假设写进脚本注释,换版本时才知道要复核哪里。
基本信息
| 常见格式 | JSON、JSON Lines(每行一个对象)、CSV、YAML、--porcelain 类稳定输出 |
|---|---|
| 优先顺序 | 工具原生 JSON 输出 > 定界符文本 > 正则解析人类可读表格 |
| 关键要求 | 固定字段名,字段缺失要有显式默认或失败处理 |
| 适用平台 | 与实现语言无关,Linux、macOS、Windows 均适用 |
典型使用场景
- 把逐台结果写入中心数据库或工单系统
- 与上一次执行结果做程序化比对,找出发生变化的项
- 从输出中抽取关键指标:版本、剩余空间、运行时长
- 供下游自动化判断是否需要重试或回滚
- 生成格式统一的巡检与合规报告
结构化取值示例
结构化取值示例
systemctl show nginx --property=ActiveState,SubState --value # 键值型输出,字段稳定
export NO_COLOR=1 # 先关掉颜色,避免转义序列污染
json=$(ssh -n "$h" 'curl -s http://127.0.0.1:8080/healthz') # 让服务直接返回 JSON
printf '%s' "$json" | jq -r '.status, .uptime' # 用解析器取值,不用正则
printf '%s\n' "$json" | jq -e . >/dev/null || echo "非法 JSON: $h" # jq -e 让非法输入返回非零输出形态与可解析性
| 输出形态 | 可解析性 | 建议做法 |
|---|---|---|
| 原生 JSON | 高,字段名稳定 | 首选,直接交给 jq 或语言内置解析器 |
| 定界符文本 | 中,需确认字段数 | 用 cut 或 awk 按固定位置解析并校验列数 |
| 人类可读表格 | 低,列宽随内容变化 | 仅在无其他选择时使用,并锁定工具版本 |
| 带颜色转义的输出 | 极低 | 先关闭颜色(NO_COLOR=1 或 --no-color) |
| 多行自由文本 | 不可靠 | 只提取错误关键字或首行,不做全量解析 |
非交互执行时还应关闭 pager(多数工具支持 --no-pager 或设置 PAGER=cat),否则命令会等待翻页输入,批量任务在没人看终端时直接挂住。
用正则解析人类可读输出很脆弱:字段顺序或措辞随版本变化,解析器可能静默匹配到错误内容而不报错。因此要把「解析结果为空或字段缺失」当作失败处理,而不是当成合法值继续往下走。