不开 Excel、不写脚本:用正则捕获组把日志直接算成数据(求和 / 均值 / 分位 + 分组聚合)

· 约 3 分钟 🔍 Regex Pro

打开 regex101,它会告诉你”匹配到了 1,284 条”。但运维排障时你真正想知道的不是”几条”,而是——这些接口平均耗时多少?P99 是多少?哪个接口最慢?哪个错误码最多? 这些问题,传统做法要么导进数据库写 SQL、要么写个 awk/Python 脚本。Regex Pro 的「统计」面板把这一步搬进了浏览器:把捕获组当数据列,贴日志直接出表

核心概念:捕获组就是数据列

「匹配列表」给你每条命中的明细;「统计」面板把这些命中当成一张表来汇总。关键是”聚合目标”下拉——你选”整段匹配($&)“或某个捕获组,工具就把每条命中里那一部分的值抽成一列,然后并行算两件事:

类型算什么适合的列
数值聚合数量 / 求和 / 平均 / 中位数 / P95 / P99 / 极值耗时、金额、字节数等能解析成数字的
频次统计出现了哪些不同值、各几次状态码、接口名、错误类型等离散值

一句话:匹配列表是明细,统计面板把明细汇成数。

实战:从原始日志到”每接口耗时表”

假设日志长这样:

2026-05-30 10:01:22 GET /api/user/profile status=200 cost=132ms
2026-05-30 10:01:23 GET /api/order/list   status=200 cost=455ms
2026-05-30 10:01:24 GET /api/user/profile status=500 cost=12ms
2026-05-30 10:01:25 GET /api/order/list   status=200 cost=1320ms

第一步:一条带命名组的正则

Pattern:  (?<api>/api/[\w/]+)\s+status=(?<code>\d{3})\s+cost=(?<ms>\d+)ms

三个命名组各管一件事:api 分类维度、code 状态码、ms 耗时。贴进测试文本后,先在「匹配列表」确认三组都对位。

抓数字的关键:让捕获组里只放纯数字。写 cost=(?<ms>\d+)ms 而不是 (?<ms>\d+ms)——把 ms 留在组外,组里是干净的 132,数值聚合才认得。金额同理 \$(?<amt>\d+\.\d{2})$ 在组外。

第二步:整体数值视图

切「统计」面板,聚合目标选 ms 组:

数量 4   求和 1919   平均 479.75
中位数 293.5   P95 1320   P99 1320   最大 1320   最小 12

一眼看到整体耗时分布。

第三步:分组聚合 = GROUP BY

面板下半部”按 api 分组、对每组的 ms 求和 / 均值 / 极值”:

api次数均值最大
/api/user/profile214472132
/api/order/list21775887.51320

/api/order/list 均值是另一个接口的 12 倍——最慢接口一眼锁定,全程不碰数据库、不写脚本。

第四步:换个维度看频次

把聚合目标换成 code,频次统计告诉你 200 出现 3 次、500 出现 1 次——状态码分布立现。文本型维度(状态码、错误类型、地区)都走频次这栏。

命中很多 / 日志很大怎么办

  • 统计算的是全量命中,不是列表里显示的前几十条——匹配在 Worker 里完整跑完(单次最多收集到 5 万条量级),几千上万行日志的均值和分位都准。
  • 文件超过约 2MB:用测试文本区的「📁 打开文件」走流式扫描,分块扫不卡页面。
  • 海量数据:先用正则把目标行 grep 出来、再贴进来做精细聚合,或分批处理,避免撞收集上限。

把结果拿出去

按钮给你什么用途
复制统计数值摘要文本贴进工单 / 报告
复制数值列该列全部原始值,每行一个粘进 Excel 当一列,自己做透视 / 画图
复制分组分组聚合表,TSV粘进 Excel / 飞书表格自动分列

典型闭环:用「复制分组」导出每接口耗时表 → 表格里按均值排序找最慢的 → 把那条接口名拿回工具、收紧正则只匹配它 → 用数值聚合单独看它的 P99 分布。

正则不只是”找东西”的工具。当你把捕获组看成数据列,一条 pattern 就能把一堆非结构化日志变成可读的数据表——这是 Regex Pro 区别于普通正则测试器的地方。

❓ 常见问题

「统计」面板和「匹配列表」有什么区别?它到底算的是什么?

「匹配列表」给你每一条命中(整段 + 各捕获组的值和位置);「统计」面板则把这些命中当成一张表来聚合。核心概念是"聚合目标"——你在下拉里选"整段匹配($&)"或"组 1 / 组 2 / 命名组 xxx",工具就把每条命中里那一部分的值抽出来当成一列数据,然后两件事并行算:(1) 数值聚合 —— 若这列的值能解析成数字(如耗时 123、金额 45.6),就给出 数量 / 求和 / 平均 / 最小 / 最大 / 中位数 / P95 / P99 这类统计;(2) 频次统计 —— 不管是不是数字,都按"出现了哪些不同的值、各几次"做频率分布(比如统计哪个 HTTP 状态码最多)。一句话:匹配列表是明细,统计面板是把明细汇总成数。

我有一堆 Nginx / 应用日志,想算"每个接口的平均耗时和 P99",怎么操作?

这正是「分组聚合」要解决的。三步:(1) 写一条带两个命名组的正则——一个抓接口名、一个抓耗时,例如 (?<api>/api/[\w/]+).*?(?<ms>\d+)ms,贴日志后在「匹配列表」确认两组都抓对了;(2) 切到「统计」面板下半部的分组聚合区," api 分组"——把命中按接口名归类,"对每组的 ms 求和 / 均值 / 极值"——选耗时那个组;(3) 工具立刻给出每个接口的调用次数 + 耗时总和 + 平均 + 最大/最小,相当于一句 SQL GROUP BY api 的效果,但你不用导库、不用写脚本,贴日志就出表。要看整体 P99(不分接口)就用上半部的数值聚合、聚合目标选 ms 组。算完点「复制分组」导出 TSV,直接粘进 Excel 或飞书表格。

捕获组抓出来的值带单位或符号(像 123ms、$45.60、1,200),统计能认成数字吗?

最稳的做法是让正则只把"纯数字部分"放进捕获组,单位和符号留在组外。比如别写 (?<t>\d+ms)(组里含 ms,可能干扰解析),写成 (?<t>\d+)ms——ms 在组外,组里只有干净数字 123。同理金额写 \$(?<amt>\d+\.\d{2})$ 在组外,千分位 1,200 这种最好在正则里就把逗号排除或后续处理,因为捕获组里留着 , 会让数值解析为难。原则:捕获组 = 你要统计的那一个纯数值,所有装饰(货币符、单位、千分位逗号、百分号)尽量挡在组外。这样数值聚合才能正确求和求均值。如果某列本就该当文本看(状态码、接口名、错误类型),那走频次统计就好,不需要它是数字。

命中很多(成千上万条)也能统计吗?会不会只算了预览的前几十条?

统计是对所有命中算的,不是只算列表里显示的那几十条——匹配在 Web Worker 里完整跑完,列表为性能只渲染前一批,但聚合用的是全量结果(工具单次最多收集到 5 万条命中量级,普通日志够用)。所以你能放心拿它算几千上万行日志的均值和分位。大日志提醒:如果日志文件很大(超过约 2MB),用测试文本区的「📁 打开文件」走流式扫描模式,工具会分块扫不卡页面。一个边界:流式 / 超大文本模式下,复杂的全量捕获组聚合可能受收集上限影响,海量数据建议先用正则把目标行 grep 出来、再贴进来做精细统计,或分批处理。日常几千行的接口日志、交易流水,直接贴进来算完全没问题。

算完的统计结果怎么拿出去?能直接进 Excel 吗?

面板提供三个复制按钮,按需选:(1) 「复制统计」 —— 把当前聚合目标的数值摘要(数量 / 和 / 均值 / 分位等)复制成一段文本,适合贴进报告或工单;(2) 「复制数值列」 —— 把该聚合目标这一列的所有原始值按行复制,直接粘进 Excel 就是一列,你想自己再做透视或画图就用这个;(3) 「复制分组」 —— 把分组聚合表复制成 TSV(制表符分隔),粘进 Excel / 飞书表格 / Google Sheets 会自动分列,每行一个分组、列是次数和各项统计。典型工作流:用「复制分组」把"每接口耗时表"导出贴进表格 → 排序找最慢接口 → 把异常那条接口名拿回来、改正则只匹配它、用数值聚合看它的 P99 分布。整个过程不碰数据库、不写一行脚本。

🔍 打开 Regex Pro 对标 regex101·pattern 语法着色·AST 中文解释·命名组捕获/回引·替换预览·大文本 grep 模式·Web Worker 超时保护·本地运行

📖 同一工具的其他教程