本文介绍如何使用 JavaScript 将 MySQL/MariaDB 命令行客户端(如 mysql –version 或 STATUS 输出)的非结构化文本,健壮、准确地转换为标准 JSON 格式,重点解决键值对识别、空行 / 标题行过滤及多空格分隔等常见解析陷阱。
本文介绍如何使用 javascript 将 mysql/mariadb 命令行客户端(如 `mysql –version` 或 `status` 输出)的非结构化文本,健壮、准确地转换为标准 json 格式,重点解决键值对识别、空行 / 标题行过滤及多空格分隔等常见解析陷阱。
在运维脚本、数据库监控工具或自动化诊断系统中,常需解析 mysql -e “STATUS” 或 mysql –version 的终端输出。这类输出虽为人可读,但格式松散:存在多空格对齐、冒号后缩进不一致、混合空行与聚合指标行(如 Threads: 11 Questions: 417…),直接用简单正则或 split(‘:’) 易出错。
以下是一个 生产就绪的解析方案,兼顾鲁棒性与可读性:
✅ 核心策略
- 跳过干扰行:以 mysql 开头的版本行和纯空行直接忽略;
- 统一键值分割:优先按 : 切分,再 trim() 清理首尾空格;
- 智能处理聚合行:当某行含多个 key: value 对(如 Threads: 11 Questions: 417…),先用双空格(` `)切分,再逐对解析;
- 保留原始语义:键名完全复用原文(含空格和点号,如 “Conn. characterset”),避免歧义。
? 完整可运行代码
const input = ` mysql Ver 15.1 Distrib 10.4.22-MariaDB, for Linux (x86_64) using readline 5.1 Connection id: 11725017 Current database: Current user: cartadmin@localhost SSL: Not in use Current pager: stdout Using outfile: ''Using delimiter: ; Server: MariaDB Server version: 10.2.10-MariaDB-log MariaDB Server Protocol version: 10 Connection: 127.0.0.1 via TCP/IP Server characterset: latin1 Db characterset: latin1 Client characterset: utf8 Conn. characterset: utf8 TCP port: 3306 Uptime: 1255 days 10 hours 56 min 30 sec Threads: 11 Questions: 41743540474 Slow queries: 157520 Opens: 3668268 Flush tables: 47 Open tables: 512 Queries per second avg: 384.834 `; function parseMysqlStatus(input) {const lines = input.trim().split('n'); const data = {}; for (const line of lines) {const trimmed = line.trim(); // 跳过版本行和空行 if (trimmed.startsWith('mysql') || trimmed ==='') continue; // 检查是否为聚合行(含多个 key: value)if (trimmed.includes('') && trimmed.split(' ').some(s => s.includes(':'))) {const segments = trimmed.split(/ +/); // 使用正则匹配 ≥2 个空格分割 for (const segment of segments) {const [key, ……rest] = segment.split(':').map(s => s.trim()); if (key && rest.length > 0) {data[key] = rest.join(':').trim(); // 处理值中含冒号的情况(如 Server version)} } } else {// 单 key-value 行 const [key, ……rest] = trimmed.split(':').map(s => s.trim()); if (key && rest.length > 0) {data[key] = rest.join(':').trim();} } } return data; } // 执行转换并输出美化 JSON const result = parseMysqlStatus(input); console.log(JSON.stringify(result, null, 2));
⚠️ 关键注意事项
- 不要依赖固定列宽:MariaDB 版本、字符集名称等长度可变,禁止用 substring() 截取;
- 冒号是唯一可靠分隔符:即使 Client characterset: utf8 中有空格,也必须以 : 为界;
- 聚合行需谨慎处理:Threads: 11 Questions: 417… 中的双空格是人为对齐,不是结构分隔符——应使用 / +/ 正则匹配连续空格,而非简单 split(‘ ‘);
- 空值显式保留:如 “Current database”: “”,体现原始状态,不可省略或设为 null;
- JSON 兼容性:所有键名自动成为合法 JSON 字符串(无需额外转义),值中若含单引号(如 Using outfile: ”)会原样保留为 “”。
✅ 输出示例(片段)
{"Connection id": "11725017", "Current database": "", "Current user": "cartadmin@localhost", "SSL": "Not in use", "Server version": "10.2.10-MariaDB-log MariaDB Server", "Threads": "11", "Questions": "41743540474", "Queries per second avg": "384.834"}
该方案已在 Node.js 14+ 及浏览器环境中验证通过,可无缝集成至 CI/CD 状态检查、Prometheus Exporter 或 Web 管理后台。如需进一步结构化(如将 Uptime 解析为秒数、Server version 提取主版本号),可在 parseMysqlStatus 返回对象后链式处理,保持职责单一。