• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:5秒に1回以上アクセスしてくる接続元IPをアクセスログから抽出したい)

アクセスログから過去1分間に12回以上アクセスしているIPを抽出する方法

このQ&Aのポイント
  • 質問者は、アクセスログから過去1分間に12回以上アクセスしているIPを抽出する方法を知りたいとしています。
  • アクセスログファイルは、それぞれのドメインごとに保存されており、フォーマットは接続元IP、アクセス日時、アクセス先ファイル、User-agentの順です。
  • 質問者は、cronを使用して1分おきにシェルスクリプトを実行し、アクセスログを調査する予定です。

質問者が選んだベストアンサー

  • ベストアンサー
  • uwi
  • ベストアンサー率74% (55/74)
回答No.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];  # 添字、空白、カウントを表示する }

tanpopo012
質問者

お礼

ありがとうございます。よく分かりました。 これを自分で書けるようになるには相当時間がかかりそうです。

その他の回答 (2)

  • uwi
  • ベストアンサー率74% (55/74)
回答No.2

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];}' 何してるかの説明は端折るので参考程度に。

tanpopo012
質問者

補足

完璧に動作しました。ありがとうございます。できれば 何をやってるかパーツパーツで解説願えないでしょうか。 ひとつひとつ勉強していっていますがアヤフヤで・・

  • inu2
  • ベストアンサー率33% (1229/3720)
回答No.1

grepすれば良いのでは?

関連するQ&A