粘贴在带有结束空格的字符串的perl正则表达式表达式上

时间:2013-03-07 03:37:16

标签: regex perl

以下是来自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

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

3 个答案:

答案 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+)!