我正在尝试解析我的maillog,其中包含许多类似于以下行的行:
Jun 6 17:52:06 host sendmail[30794]: p569q3sX030792: to=<person@recipient.com>, ctladdr=<apache@host.com> (48/48), delay=00:00:03, xdelay=00:00:03, mailer=esmtp, pri=121354, relay=gmail-smtp-in.l.google.com. [1.2.3.4], dsn=2.0.0, stat=Sent (OK 1307354043 x8si28599066ict.63)
我想申请的规则是:
日志中有一些与收件人无关的行,所以我想完全忽略这些行。
以下代码适用于任何一个规则,但是我在组合它们时遇到了问题:
if($_ =~ m/\ to=([<>a-zA-Z0-9\.\@]*),\ /g) {
print "$1\n";
}
if($_ =~ /^+(\S+\s+\S+\s)/g) {
print "$1\n";
}
与往常一样,我不确定我上面使用的正则表达式是否是“最佳实践”,所以请随意指出我在那里做得很糟糕的事情:)
谢谢!
答案 0 :(得分:2)
print substr($_, 0, 7), "$1\n" if / to=(.+?), /;
您的日期采用固定长度格式,您不需要正则表达式来匹配它
对于地址,您需要的是to=
和下一个,
之间的部分,因此非贪婪的匹配正是您所需要的。
答案 1 :(得分:0)
要与一个正则表达式匹配,or
一起使用语法(regex1|regex2)
:
((?<\ to=)[<>a-zA-Z0-9\.\@]*(?=,\ )|^\S+\s+\S+\s)
外部括号会为$1
分配匹配项。
(?<\ to=)
后面的外观并向前看(?=,\ )
不捕获任何内容,因此这些正则表达式只捕获目标字符串。