在perl中打印每个IP地址和GET / PUT / POST / DELETe请求的数量

时间:2017-08-11 04:38:51

标签: regex perl ip-address

我有一个apache日志,如下所示。

192.168.10.20 - - [18 / Jul / 2017:08:41:37 +0000]" PUT / search / tag / list HTTP / 1.0"

10.30.24.3 - - [18 / Jul / 2017:08:45:15 +0000]" POST / search / tag / list HTTP / 1.0"

192.168.10.20 - - [18 / Jul / 2017:09:04:09 +0000]" GET /apps/cart.jsp?appID=4651 HTTP / 1.0"

192.168.10.20 - - [18 / Jul / 2017:09:04:09 +0000]" GET /apps/cart.jsp?appID=4651 HTTP / 1.0"

10.30.24.3 - - [18 / Jul / 2017:08:45:15 +0000]" POST / search / tag / list HTTP / 1.0"

它由相同的ip地址多次组成,具有不同的reqeust类型。 可以在perl中提供解决方案来提取所有ip地址,对它们进行分组,并且不对每个ip地址发出POST / GET / DELETE请求。 输出格式应该像

192.168.10.20:GET = 23,POST = 13,PUT = 23,DELETE = 11

43.56.76.4:GET = 4,POST = 3,PUT = 1,DELETE = 3

直到现在我已经这样做了,提取了ip和请求类型并登录到另一个文件然后计算每次出现:

np.zeros()

- 但是我的输出结果如下 192.168.10.20:GET = 23

192.168.10.20:POST = 16

43.56.76.4:GET = 4

43.56.76.4:POST = 3

等等.`

1 个答案:

答案 0 :(得分:1)

open(FileHandle, "<$ARGV[0]");
%hash = ();
while(<FileHandle>)
{
    chomp($_);
    if($_ =~ /^(\d{1,}\.\d{1,}\.\d{1,}.\d{1,})/) { $ip = $1; }
    if($_ =~ /GET/) { $hash{$ip}{"GET"}++; }
    if($_ =~ /POST/) { $hash{$ip}{"POST"}++; }
    if($_ =~ /PUT/) { $hash{$ip}{"PUT"}++; }
    if($_ =~ /DELETE/) { $hash{$ip}{"DELETE"}++; }
}
foreach $k (keys %hash)
{
    print "$k: GET=$hash{$k}{'GET'},POST=$hash{$k}{'POST'},PUT=$hash{$k}{'PUT'},DELETE=$hash{$k}{'DELETE'}\n";
}