You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用awk正则实现多行日志解析 提取message[]内内容并排除末尾]

日志内容提取实现方案

正则核心思路

可以用正则实现该需求,核心解决两个问题:

  • 支持跨行匹配中间所有内容
  • 准确识别结束边界:message [后的内容以整个日志块的最后一个]为结束标记,中间出现的[/]均作为内容保留
    适配需求的正则逻辑为:匹配, message [之后、到整段输入末尾最后一个]之前的所有字符,含换行、特殊符号等,可按需将中间的换行符替换为空格拼接输出。

1. awk 实现方案(适配你当前的脚本场景)

awk默认按行处理,我们可以先把所有行读入内存拼接后再匹配,示例代码:

awk '{buf = buf $0} END {
    if (match(buf, /, message \[(.*)\]$/, arr)) {
        gsub(/\n/, "", arr[1]) # 去掉中间换行,和你给的期望输出格式一致
        print arr[1]
    }
}' 你的日志文件路径

说明:

  • 先把所有行存入buf变量,规避单行处理的跨行匹配问题
  • 正则, message \[(.*)\]$里的.*默认是贪婪匹配,会自动匹配到最后一个]为止,括号分组捕获的就是你要的内容
  • 如果需要保留内容里的原始换行,删掉gsub那行即可

2. GNU grep 快速实现

如果你的环境有GNU grep(支持-z、-P参数),可以一行命令完成:

grep -zoP ', message \[\K.*(?=\]$)' 你的日志文件路径 | tr -d '\0' | tr '\n' ' '

说明:

  • -z参数让grep用\0作为行分隔符,把整个文件当成单行处理,支持跨行匹配
  • \K表示忽略前面的匹配内容,直接返回后面的结果
  • (?=\]$)是正向预查,匹配到最后一个]之前结束
  • 后面的tr命令用来去掉空字符和替换换行符,和期望输出格式对齐

效果验证

  • 无报错日志输入时,输出:No errors encountered.
  • 多行报错日志输入时,输出你要求的拼接后完整报错内容,完全符合预期。

内容的提问来源于stack exchange,提问作者l_obr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 02:27:01