按日志顺序拆分
用 \S+ 匹配不含空格的字段,用 [^\]]+ 匹配方括号中的时间,用 [^\"]+ 匹配引号里的请求内容。
使用带命名捕获组的正则表达式将日志行解析为结构化表格。
使用命名捕获组,例如 (?<ip>\S+) ,每个捕获组会成为一个结果列。
| ip | user | time | method | path | proto | status | size |
|---|---|---|---|---|---|---|---|
| 127.0.0.1 | frank | 10/Aug/2026:13:55:36 +0000 | GET | /api/users | HTTP/1.1 | 200 | 1024 |
| 10.0.0.5 | - | 10/Aug/2026:13:55:37 +0000 | POST | /login | HTTP/1.1 | 302 | - |
编写表达式
先让表达式匹配一整行,再用命名捕获组标出需要输出的字段。每个非空日志行都必须匹配成功,捕获组名称会自动成为表格列名。
用 \S+ 匹配不含空格的字段,用 [^\]]+ 匹配方括号中的时间,用 [^\"]+ 匹配引号里的请求内容。
把要输出的部分写成 (?<name>...) ,例如 (?<status>\d{3}) 会生成名为 status 的结果列。
用 ^ 匹配行首、用 $ 匹配行尾;这样可以尽早发现字段顺序、空格或尾部内容不一致的日志行。
下面的表达式会提取 IP、用户、时间、请求方法、路径、协议、状态码和响应大小。
^(?<ip>\S+) \S+ (?<user>\S+) \[(?<time>[^\]]+)\] "(?<method>\S+) (?<path>\S+) (?<proto>[^"]+)" (?<status>\d{3}) (?<size>\S+)$ s ,英文字母大小写不固定时使用 i ; g 不会跨日志行复用匹配游标。 INFO app started{ level: INFO, message: app started }更新于 2026-10-18 · 项目与反馈说明