Perl:解析maillog以在单个正则表达式语句中获取日期/接收者

时间:2011-06-12 07:58:12

标签: regex perl

我正在尝试解析我的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)

我想申请的规则是:

  • 日期始终是前2个字
  • 电子邮件地址始终发生在“to=person@recipient.com”之间,但电子邮件地址可能会被&lt;&gt;
  • 包围

日志中有一些与收件人无关的行,所以我想完全忽略这些行。

以下代码适用于任何一个规则,但是我在组合它们时遇到了问题:

if($_ =~ m/\ to=([<>a-zA-Z0-9\.\@]*),\ /g) {
  print "$1\n";
}

if($_ =~ /^+(\S+\s+\S+\s)/g) {
  print "$1\n";
}

与往常一样,我不确定我上面使用的正则表达式是否是“最佳实践”,所以请随意指出我在那里做得很糟糕的事情:)

谢谢!

2 个答案:

答案 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=)后面的外观并向前看(?=,\ )不捕获任何内容,因此这些正则表达式只捕获目标字符串。