2013-03-07 170 views
0

下面是一个FTP日志行:字符串结尾空格

2013年3月5日18时37分31秒543.21.12.22 []送 /家/ MYDOMAIN /public_html/court-9746hd/Chairman-confidential-video.mpeg 226 [email protected] 256

我使用了一个名为简单事件归属关系计划,从正则表达式的括号内拉值并将这些值设置为一个变量。

所以,这里是这是应该对以前的日志文件行操作SEC配置文件中的条目:

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

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

相反,它翻出下载的文件:Chairman-confidential-video.mpeg 226 [email protected] 256

所以你看,我有困难得到的第二次提取停止在文件名后面的第一个空白处。我试过了:

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

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

回答

2

如果你只想匹配非空白,用\S*或者空格替换.*是要排除再使用[^ ]*,而不是唯一的字符。

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

0

不是使用。*构造,而是使用范围较窄的东西,作为一般规则。在这种情况下,你需要的是一些东西,是不是白色的空间,所以说明确:

pattern=sent \/home\/mydomain\/public_html\/([^\s]+)\/([^\s]+) 
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 [email protected] 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+)! 
相关问题