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

AWK无法提取maillog中带空格的from字段,求通用正则方案

问题描述

使用AWK从maillog提取字段时,多数场景正常,但遇到包含自定义名称(含空格)的from字段时解析失败。

异常日志示例:

May 10 07:15:04 chitraak sendmail[8558]: 34ABF4Kb008569: from=<"dexter prod" <dexter_noreply@au.edu>>, size=452, class=0, nrcpts=1, msgid=<202305101115.34ABF4Kb946558@chitraak.abc.com>, proto=ESMTP, daemon=MTA, relay=ip-192-68-1-4.ec2.internal [1.2.3.4]

执行原命令:

cat email | awk '{print $7 " " $NF}'

得到错误输出:

from=<"dexter [1.2.3.4]

其余日志的from字段为from=<邮箱地址>格式(无空格),原命令可正常处理。现需实现一个通用逻辑,同时兼容两种from格式,输出如下指定格式:

from=<"dexter prod" <dexter_noreply@au.edu>> [1.2.3.4]
from=<dexter_noreply@au.edu> [1.2.3.5]

询问是否可用单个正则实现,还是需要分开处理?

解决方案

可以通过单个正则表达式实现,无需拆分逻辑。核心是用正则精准捕获完整的from字段和末尾的IP地址。

最终AWK命令

awk '{
    match($0, /(from=<[^>]+>)/, from_match);
    match($0, /\[([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)\]$/, ip_match);
    print from_match[1], "[" ip_match[1] "]"
}' email

正则逻辑说明

  • 捕获from字段:/(from=<[^>]+>)/
    从from=起始,匹配到该行中最后一个>结束,无论字段内包含空格、引号等特殊字符,都能完整抓取整个from内容。
  • 提取IP地址:/\[([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)\]$/
    匹配行尾的[IP]格式,单独提取括号内的IP地址段。

测试验证

  • 针对带自定义名称的日志,输出符合要求:from=&lt;&quot;dexter prod&quot; &lt;dexter_noreply@au.edu&gt;&gt; [1.2.3.4]
  • 针对普通格式的日志,输出符合要求:from=&lt;dexter_noreply@au.edu&gt; [1.2.3.5]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 15:05:24