我试图通过看起来像这样的apache日志来计算每分钟的访问次数
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
这有效,但我想避免计算对swz,css,gif,png,jpg等静态文件的访问。
我尝试将正则表达式改为
\[(.+?:[0-9]{2}:[0-9]{2}).+?(?:POST|GET) \/[^ ]+(?!\.swz|\.gif|\.css|\.jpg)
但这仍然匹配。我想避免将它们全部匹配。
答案 0 :(得分:1)
对正则表达式进行一些修改可以解决问题。
\[(.+?:[0-9]{2}:[0-9]{2}).+?(?:POST|GET) \/(?![^ ]+(\.swz|\.gif|\.css|\.jpg))[^ ]+
首先,我们检查在GET | POST之后不能匹配* .swz,* .gif,...然后捕获文件名。
答案 1 :(得分:0)
[^ ]+
正在使用文件名,然后可以忽略负面预测。
尝试在负面预测后添加另一个[^ ]
,以防止包含整个文件名的匹配...
\[(.+?:[0-9]{2}:[0-9]{2}).+?(?:POST|GET) \/[^ ]+(?!\.swz|\.gif|\.css|\.jpg)[^ ]