将 MariaDB 客户端输出文本安全解析为结构化 JSON 数据

2次阅读

本文介绍如何使用 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 返回对象后链式处理,保持职责单一。

星耀云
版权声明:本站原创文章,由 星耀云 2026-03-22发表,共计2616字。
转载说明:转载本网站任何内容,请按照转载方式正确书写本站原文地址。本站提供的一切软件、教程和内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。
text=ZqhQzanResources