2014-03-27 110 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 –

相关问题