exim4 mta的perl日志解析器
我将为exim4 MTA编写日志解析器,我有几个问题。 (我知道有一个exilog程序) 问题: 1.解析行的更好方法是什么?(这类行的缩写为5Gb:D) 我有一句话:exim4 mta的perl日志解析器,perl,parsing,logging,mta,exim4,Perl,Parsing,Logging,Mta,Exim4,我将为exim4 MTA编写日志解析器,我有几个问题。 (我知道有一个exilog程序) 问题: 1.解析行的更好方法是什么?(这类行的缩写为5Gb:D) 我有一句话: 2011-12-24 12:32:12消息(from@some.email)=>H=[321.123.321.123]T=“你好,这是一个测试” 并希望将所有这些字段转换为变量。 我现在使用的是($var,[var2])=($line=~/somecoolregexp/);它是快/好还是我应该用别的东西?好吧,这取决于你想对数据
2011-12-24 12:32:12消息(from@some.email)=>H=[321.123.321.123]T=“你好,这是一个测试”
并希望将所有这些字段转换为变量。
我现在使用的是
($var,[var2])=($line=~/somecoolregexp/)
;它是快/好还是我应该用别的东西?好吧,这取决于你想对数据做什么
假设您有一个大的while(){…}
,只需使用split即可获得最简单的解析:
my @fields = split;
下一个层次是增加一点意义
my ($date, $time, $id, $host, $from, $to, undef, $dest) = split;
(注意,如果要忽略结果,可以指定给unde
)
最后,您可以通过使用正则表达式来清除许多积垢。您还可以将上面的拆分与较小的regexp组合,以单独清理每个字段
my ($datetime, $id, $host, $from, $to, $dest) =
/([\d-]+ [\d:]+) \s+ # date and time together
(\S+) \s+ # message id, just a block of non-whitespace
<(.*?)> \s+ # hostname in angle brackets, .*? is non-greedy slurp
\((.*?)\) \s+ # from email in parens
<(.*?)> \s+ # to email in angle brackets
\S+ \s+ # separated between to-email and dest
(\S+) # last bit, could be improved to (\w)=\[(.*?)\]
/x; # /x lets us break all of this up, so its a bit readable
my($datetime,$id,$host,$from,$to,$dest)=
/([\d-]+[\d:]+)\s+#日期和时间在一起
(\S+)\S+#消息id,只是一块非空白
\s+#尖括号中的主机名,*?这是非贪婪的咕噜声吗
\((.*)\)\s+#来自parens中的电子邮件
\s+#以尖括号形式发送电子邮件
\S+\S+#分为发送电子邮件和发送目的地
(\S+)#最后一位,可以改进为(\w)=\[(.*)\]
/x、 #/x让我们把所有这些都分解,所以它有点可读性
当然,你可以继续把它理解成各种各样的愚蠢行为,但是如果你要开始对这些字段进行更具体的解析,我会先进行初始拆分,然后进行断开的字段解析。例如:
my ($date, $time, ...) = split;
my ($year, $month, $day) = split(/-/, $date);
my ($hour, $min, $sec) = split(/:/, $time);
my ($from_user, $from_host) = ( $from =~ /< ([^\@]+) \@ (.*) >/x );
...etc...
my($date,$time,…)=拆分;
我的($year,$month,$day)=拆分(/-/,$date);
我的($hour,$min,$sec)=拆分(/:/,$time);
我的($from\u user,$from\u host)=($from=~/<([^\@]+)\@(.*)>/x);
等
好吧,这取决于你想对数据做什么
假设您有一个大的while(){…}
,只需使用split即可获得最简单的解析:
my @fields = split;
下一个层次是增加一点意义
my ($date, $time, $id, $host, $from, $to, undef, $dest) = split;
(注意,如果要忽略结果,可以指定给unde
)
最后,您可以通过使用正则表达式来清除许多积垢。您还可以将上面的拆分与较小的regexp组合,以单独清理每个字段
my ($datetime, $id, $host, $from, $to, $dest) =
/([\d-]+ [\d:]+) \s+ # date and time together
(\S+) \s+ # message id, just a block of non-whitespace
<(.*?)> \s+ # hostname in angle brackets, .*? is non-greedy slurp
\((.*?)\) \s+ # from email in parens
<(.*?)> \s+ # to email in angle brackets
\S+ \s+ # separated between to-email and dest
(\S+) # last bit, could be improved to (\w)=\[(.*?)\]
/x; # /x lets us break all of this up, so its a bit readable
my($datetime,$id,$host,$from,$to,$dest)=
/([\d-]+[\d:]+)\s+#日期和时间在一起
(\S+)\S+#消息id,只是一块非空白
\s+#尖括号中的主机名,*?这是非贪婪的咕噜声吗
\((.*)\)\s+#来自parens中的电子邮件
\s+#以尖括号形式发送电子邮件
\S+\S+#分为发送电子邮件和发送目的地
(\S+)#最后一位,可以改进为(\w)=\[(.*)\]
/x、 #/x让我们把所有这些都分解,所以它有点可读性
当然,你可以继续把它理解成各种各样的愚蠢行为,但是如果你要开始对这些字段进行更具体的解析,我会先进行初始拆分,然后进行断开的字段解析。例如:
my ($date, $time, ...) = split;
my ($year, $month, $day) = split(/-/, $date);
my ($hour, $min, $sec) = split(/:/, $time);
my ($from_user, $from_host) = ( $from =~ /< ([^\@]+) \@ (.*) >/x );
...etc...
my($date,$time,…)=拆分;
我的($year,$month,$day)=拆分(/-/,$date);
我的($hour,$min,$sec)=拆分(/:/,$time);
我的($from\u user,$from\u host)=($from=~/<([^\@]+)\@(.*)>/x);
等
这个问题中的问题太多了。请一次发布一个具体问题。这个问题中的问题太多了。请一次发布一个具体问题。Tnx。Im计划使用CPAN::Tail进行监视。我的第一个尝试是使用split(/,$blablabla),但它被一些行(如T=“bla bla lba”)或一些错误代码(如“问题是bla lba”)打断。我计划将日志导出到mysqlTnx。Im计划使用CPAN::Tail进行监视。我的第一个尝试是使用split(/,$blablabla),但它被一些行(如T=“bla bla lba”)或一些错误代码(如“问题是bla lba”)打断。我计划将日志导出到mysql