2017-08-11 9 views
-3

私は以下のようなApacheログを持っています。perl内のGET/PUT/POST/DELETe要求の数で各IPアドレスを表示

192.168.10.20 - - [18/7月/ 2017:08:41:37 +0000] "PUT /検索/タグ/リストHTTP/1.0"

10.30.24.3 - - [18/7月/ 2017:08:45:15 +0000]「POST/search/tag/list HTTP/1.0」

192.168.10.20 - [18/7/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/7月/ 2017:08:45:15 +0000]" POST /検索/タグ/リストHTTP/1.0 "


これは、異なるreqeustタイプで複数回同じIPアドレスで構成されています。 すべてのIPアドレスを抽出するperlのソリューションを提供することができます。各IPアドレスに対してPOST/GET/DELETE要求をグループ化します。 出力フォーマットが

192.168.10.20のようにすべきである:= 1 = 4、POST = 3 PUT GET、DELETE:= 23、= 13 POSTを取得= 23を置く= 11

43.56.76.4 DELETE =私はこれを行ってきた今まで3

は、IPと要求タイプを抽出し、別のファイルに記録し、各のoccuranceのカウント:

my $file = "apache_log.log"; 
my $file2 = "apache_log1.log"; 
my %hrec; 
open (FH, "$file"); 
open(DATA, ">$file2"); 
my $str; 
while (my $line = <FH>) { 
chomp $line; 
if ($line =~ /^(\d{1,}\.\d{1,}\.\d{1,}\.\d{1,})\s+\-\s+\-\s+\[\d{1,}\/\w+\/\d{1,}\:\d{1,}\:\d{1,}\:\d{1,}\s+\+0000\]\s+\"(PUT|GET|POST|DELETE)/) { 
print DATA "$1: $2\n"; 
} 
close(DATA); 
close(FH); 
open(DATA, "$file2") or die "Couldn't open file $file2, $!"; 
while (my $str = <DATA>) { 
my @requests = split ('\n',$str); 
foreach my $req(@requests) { 
$hrec{$req}++; 
} 
} 
close(DATA); 
foreach my $fam (sort keys %hrec) { 
print "$fam =". ($hrec{$fam})."\n"; 
} 

- しかし、私の出力は 192.168以下のように来ています。 10.20:GET = 23

192.168.10.20:POST = 16

43.56.76.4:GET = 4

43.56.76.4:

+2

on.'' POST = 3

と私stackoverflowはコード作成サービスではないので、この質問を議論の対象外とする投票を行っています。 OPは問題を提供したばかりで、それを自分で解決しようとはしていませんでした。 –

+0

Regexp :: Log :: Common – ysth

+0

@SteffenUllrich..sorry ...私は試して、今私のプログラムを貼り付けました。あなたが手伝ってくれれば助けになるだろう。 –

答えて

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"; 
} 
+0

perl prog.pl <あなたのApacheログファイルを入力> –

+0

素晴らしい、それは働いた。ありがとう –

+0

@SaketKumarそれがうまくいけば、同じ問題を抱えている他の人もそれを使うことができるように私の答えを正しい解決策として選択してください。ありがとうございます –

関連する問題