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=<"dexter prod" <dexter_noreply@au.edu>> [1.2.3.4] - 针对普通格式的日志,输出符合要求:
from=<dexter_noreply@au.edu> [1.2.3.5]
内容的提问来源于stack exchange,提问作者isilia
相关产品推荐
相关产品推荐

