- ベストアンサー
アクセスログから過去1分間に12回以上アクセスしているIPを抽出する方法
- 質問者は、アクセスログから過去1分間に12回以上アクセスしているIPを抽出する方法を知りたいとしています。
- アクセスログファイルは、それぞれのドメインごとに保存されており、フォーマットは接続元IP、アクセス日時、アクセス先ファイル、User-agentの順です。
- 質問者は、cronを使用して1分おきにシェルスクリプトを実行し、アクセスログを調査する予定です。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
AWK で行単位に処理してるだけです。 まず前提としてAWKは行単位で処理して、 66.77.88.99 - - [01/Mar/2010:21:56:39 +0900] "GET /cgi/test.cgi? ... という行があった場合、空白で分割して $1 = 66.77.88.99, $2 = -, $3 = -, $4 = [01/Mar/2010:21:56:39, ... となります。 以下、改行してコメント。 /\/cgi\/test.cgi/ { # 行に/cgi/test.cgiを含む場合に以下の処理 # $4 = [01/Mar/2010:21:56:39 を:で分割してdに代入 split($4,d,/:/); # d[2]=時,d[3]=分,$1=IPアドレスをつなげた添字の配列cに1を足す。 # 添字が同じだった場合は当然、数が増えていく。 c[d[2]":"d[3]" "$1]++; } END { # 上の処理が終わったあと最後に処理 for(i in c) # 配列cの添字をiに代入してループ if(c[i]>=12) # カウントが12以上だった場合 print i" "c[i]; # 添字、空白、カウントを表示する }
その他の回答 (2)
- uwi
- ベストアンサー率74% (55/74)
cgiをPerlで書いているならPerlでスクリプト作ればいいと思いますが、ここはあえてワンライナーで。 # tail -n 100 /home/account/*/access_log | awk '/\/cgi\/test.cgi/{split($4,d,/:/);c[d[2]":"d[3]" "$1]++;}END{for(i in c)if(c[i]>=12)print i" "c[i];}' 何してるかの説明は端折るので参考程度に。
補足
完璧に動作しました。ありがとうございます。できれば 何をやってるかパーツパーツで解説願えないでしょうか。 ひとつひとつ勉強していっていますがアヤフヤで・・
- inu2
- ベストアンサー率33% (1229/3720)
grepすれば良いのでは?
お礼
ありがとうございます。よく分かりました。 これを自分で書けるようになるには相当時間がかかりそうです。