2013-03-07 165 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+)! 
相關問題