2014-03-27 104 views
0

我想從這個樣子正則表達式匹配文件名排除特定擴展

domain.com:10.10.10.10 - - [26/Mar/2014:14:14:12 +0000] "GET /online_catalogue/files/flash/libs/framework_4.6.0.23201.swz HTTP/1.0" 200 327044 "http://www.domain.com/online_catalogue/files/flash/flippingbook.swf?key=foobar" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko" 
perl -ne '$a{$1}++ if /\[(.+?:[0-9]{2}:[0-9]{2})/; END { foreach $k(keys %a) { print "$k $a{$k}\n"; } }' logfile | sort 

這個工程Apache日誌計數每分鐘的訪問,但我想避免計數訪問對像SWZ靜態文件,CSS, GIF,PNG,JPG等

我試圖改變正則表達式

\[(.+?:[0-9]{2}:[0-9]{2}).+?(?:POST|GET) \/[^ ]+(?!\.swz|\.gif|\.css|\.jpg) 

但這仍然匹配。我想避免將它們全部匹配。

回答

1

對您的正則表達式進行一些修改可以修復此問題。

\[(.+?:[0-9]{2}:[0-9]{2}).+?(?:POST|GET) \/(?![^ ]+(\.swz|\.gif|\.css|\.jpg))[^ ]+ 

首先,我們檢查,這是不可能匹配* .swz,* .gif注意,...之後GET | POST,然後捕獲的文件名。

0

[^ ]+正在消耗文件名,然後可以忽略負向預測。

嘗試負先行,以防止比賽,包括整個文件名後增加一個[^ ] ...

\[(.+?:[0-9]{2}:[0-9]{2}).+?(?:POST|GET) \/[^ ]+(?!\.swz|\.gif|\.css|\.jpg)[^ ] 

regex diagram

+0

雖然這種解決方案實際上沒有工作,我愛的視覺表現 - 是由應用程序自動生成的嗎? – Santrix

+0

@ user2210814最後錯過了+。並在這裏進行視覺表示:http://www.regexper.com –

相關問題