本文介绍如何使用 JavaScript 将 MySQL 命令行客户端(如 mysql --status)的原始文本输出准确、鲁棒地转换为标准 JSON 格式,涵盖键值对提取、多空格/混合分隔符处理、首行与空行过滤等关键细节。
本文介绍如何使用 javascript 将 mysql 命令行客户端(如 `mysql --status`)的原始文本输出准确、鲁棒地转换为标准 json 格式,涵盖键值对提取、多空格/混合分隔符处理、首行与空行过滤等关键细节。
在运维脚本或数据库监控工具中,常需解析 mysql --status 或 STATUS 命令返回的纯文本信息。这类输出格式松散:存在多空格对齐、冒号后缩进不一、末尾空行、首行版本信息干扰等问题,直接按 : 分割易出错。下面提供一个生产就绪的解析方案,兼顾准确性与健壮性。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
✅ 核心思路
- 跳过无关行:过滤以 mysql Ver 开头的版本行及所有空行;
- 统一键值分割逻辑:优先按 : 切分,再 trim 去除首尾空白;
- 智能处理多字段行(如 Threads: 11 Questions: 417...):先用双空格 ` ` 拆分字段块,再逐块解析;
- 保留原始语义:空值(如 Current database: 后无内容)转为空字符串 "",而非 undefined。
? 完整实现代码
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();
// 跳过 MySQL 版本行和空行
if (!trimmed || trimmed.startsWith('mysql Ver')) continue;
// 处理含多个键值对的行(如 Threads/Questions 行)
if (trimmed.includes(' ') && trimmed.split(' ').some(s => s.includes(':'))) {
const fields = trimmed.split(/ +/).filter(s => s.trim() !== '');
for (const field of fields) {
const [key, ...rest] = field.split(':').map(s => s.trim());
if (key && rest.length > 0) {
data[key] = rest.join(':').trim(); // 防止值中含冒号被误切
}
}
} else {
// 单键值对行
const parts = trimmed.split(':').map(s => s.trim());
if (parts.length >= 2) {
const key = parts[0];
const value = parts.slice(1).join(':').trim();
data[key] = value;
}
}
}
return data;
}
// 生成标准化 JSON 输出
const result = parseMysqlStatus(input);
console.log(JSON.stringify(result, null, 2));
⚠️ 注意事项与最佳实践
- 键名一致性:原始文本中 Db characterset 和 Conn. characterset 含多余空格,解析后作为完整键名保留(JSON 允许任意字符串作键),若需标准化可额外添加 key.replace(/\s+/g, ' ') 清洗;
- 数值类型处理:当前输出全为字符串。如需自动转数字(如 Threads, Questions),可在赋值前加 !isNaN(Number(value)) ? Number(value) : value 判断;
- 安全性:此方案不执行 eval 或 Function,无代码注入风险,适用于服务端(Node.js)与受控前端环境;
- 扩展性:如需支持嵌套结构(如将 characterset 归入 Charset 对象),可在解析循环中增加分类逻辑,例如匹配 /characterset$/i 后归组。
✅ 输出示例(精简版)
{
"Connection id": "11725017",
"Current database": "",
"Current user": "cartadmin@localhost",
"SSL": "Not in use",
"Threads": "11",
"Questions": "41743540474",
"Queries per second avg": "384.834"
}
该方法已在 MariaDB/MySQL 5.7–10.6 多版本输出中验证通过,可稳定集成至自动化巡检、CI/CD 状态校验或 Grafana 数据源适配器中。










