以下是来自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
但我只得到相同的结果。任何帮助将不胜感激。
答案 0 :(得分:2)
如果您只想匹配非空格,请将.*
替换为\S*
,或者如果空格是您要排除的唯一字符,请改用[^ ]*
。
此外,man perlre
是一个很好的参考。
答案 1 :(得分:0)
作为一般规则,不要使用。*结构,而是使用范围更窄的内容。在这种情况下,你想要的是一个不是空白的东西,所以明确地说:
pattern=sent \/home\/mydomain\/public_html\/([^\s]+)\/([^\s]+)
答案 2 :(得分: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+)!