0

以下是 ftp 日志中的一行:

2013-03-05 18:37:31 543.21.12.22 [] 发送 /home/mydomain/public_html/court-9746hd/Chairman-confidential-video.mpeg 226 court-9746hd@mydomain.com 256

我正在使用一个名为 Simple Event Correlate 的程序,它从正则表达式的括号内提取值并将这些值设置为变量。

因此,这是 SEC 配置文件中的一个条目,它应该在前一个日志文件行上运行:

    pattern=sent \/home\/mydomain\/public_html\/(.*)\/(.*)

这成功地拉出登录用户,court-9746hd并将其设置为变量,但无法正确提取下载的文件名,或者,Chairman-confidential-video.mpeg

相反,它会将下载的文件提取为:Chairman-confidential-video.mpeg 226 court-9746hd@mydomain.com 256

所以你看,我很难让第二次提取停止在文件名后面的第一个空格处。我试过了:

    pattern=sent \/home\/mydomain\/public_html\/(.*)\/(.*)\s

但我只得到相同的结果。任何帮助将不胜感激。

4

3 回答 3

2

如果您只想匹配非空格,请替换.*\S*or 如果空格是您要排除的唯一字符,则[^ ]*改为使用。

另外,man perlre是一个很好的参考。

于 2013-03-07T03:42:33.940 回答
0

作为一般规则,不要使用 .* 构造,而是使用范围更窄的东西。在这种情况下,您想要的是不是空白的东西,所以明确地说:

pattern=sent \/home\/mydomain\/public_html\/([^\s]+)\/([^\s]+)
于 2013-03-07T03:44:11.787 回答
0

一种选择是首先从该行捕获完整路径,然后使用File::Spec获取用户和文件信息:

use strict;
use warnings;
use File::Spec;

my $line = '2013-03-05 18:37:31 543.21.12.22 []sent /home/mydomain/public_html/court-9746hd/Chairman-confidential-video.mpeg 226 court-9746hd@mydomain.com 256';
my ( $path ) = $line =~ m!\s+(/home\S+)\s+!;
my ( $user, $file ) = ( File::Spec->splitdir($path) )[ -2, -1 ];

print "User: $user\nFile: $file";

输出:

User: court-9746hd
File: Chairman-confidential-video.mpeg

但是,如果您只想使用正则表达式,则以下内容将起作用:

m!/home/.+/.+/([^/]+)/(\S+)!
于 2013-03-07T04:19:08.970 回答