2011-02-09 1 views
1

私は一般的に発生するIPアドレスをApacheログから見つける必要があります。ApacheサーバーログからIPアドレスを解析する方法は?

12.1.12.1 9000 127.0.0.1 - フランク[10/10月/ 2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326 「HTTP:// WWW .example.com/start.html " " Mozilla/4.08 [ja](Win98; I; Nav) "

12.1.12.1 9000 192.145.1.23 - フランク[10/Oct/2000:13:55:36 Mozilla/4.08 [ja](Win98; I; Nav) "

"

IPアドレスを抽出するにはどうすればよいですか?各行の3番目の単語)をJavaで正規表現を使用していますか? また、私はロボットアクセスを見つけるために、そこから最も一般的なIPアドレスを見つけなければなりません。 ログには何百万もの行が含まれているので、regexpはこれに適しています。

+1

なぜ正規表現を気にしませんか?部分文字列を2番目と3番目のスペースの間に入れてください。 –

+0

私は何百万本もの線から取り除かなければなりません。 – Anand

+0

いいえAnandいいえ、正規表現には2番目と3番目の領域のインデックスを見つけてから部分文字列に直接アクセスするよりもオーバーヘッドが多いため、何百万行ものデータを取り込むと高速になります。 –

答えて

0

ここに1つのソリューションです:

String str1 = "12.1.12.1 9000 127.0.0.1 - frank [10/Oct/2000:13:55:36" 
      + " -0700] \"GET /apache_pb.gif HTTP/1.0\" 200 2326 " 
      + "\"http://www.example.com/start.html\" \"Mozilla/4.08 " 
      + "[en] (Win98; I ;Nav)\""; 

String str2 = "12.1.12.1 9000 192.145.1.23 - frank [10/Oct/2000:13:55" 
      + ":36 -0700] \"GET /apache_pb.gif HTTP/1.0\" 200 2326 " 
      + "\"http://www.example.com/start.html\" \"Mozilla/4.08 " 
      + "[en] (Win98; I ;Nav)\""; 

Pattern p = Pattern.compile("\\S+\\s+\\S+\\s+(\\S+).*"); 

Matcher m = p.matcher(str1); 
if (m.matches()) 
    System.out.println(m.group(1)); 

m = p.matcher(str2); 
if (m.matches()) 
    System.out.println(m.group(1)); 

REG-EX内訳:

  • \S+、一つ以上の非白色スペース文字。
  • \s+、1つ以上の空白文字。グループ1
3

あなたが言ったように常に3番目の単語であることが確かであれば、正規表現はまったく必要ないかもしれません。あなたは単純な分割によって3番目の単語を取ることができます。

はしかし、誰かがすでにその尋ねた:Regular expression to match DNS hostname or IP Address? ...

0

アクセスログファイルの形式でキャプチャ

  • ...
  • (\\S+) 1以上の非空白文字は、必ず設定ファイルの設定に依存します。現在の設定ファイルを読み込み、それに応じてアクセスログファイルをLogFormatエントリに解析するには、IPアドレスが3番目の「単語」であると仮定するのではなく、おそらく良いでしょう。

    Apache httpdは、httpd.confおよびTomcatからserver.xmlに従って動作します。 server.xmlはXMLファイルであり、AccessLogValveの解析を標準的な手順にします。

    これはもう少し作業ですが、永続化する必要がある場合に備えて、アプリケーションの柔軟性が向上します。このアプローチでは、文字列メソッドが正規表現よりも使いやすくなると思います。

  • 2

    他の人が指摘しているように、正規表現は必要ありません。正規表現も使用するため、String.splitを使用しないでください。代わりにStringTokenizerを使用できます。 BufferedReader brを使って各行を読み込むと仮定します。

    String line = br.readLine(); 
    StringTokenizer st = new StringTokenizer(line, " "); 
    st.nextToken(); 
    st.nextToken(); 
    String ip = st.nextToken(); 
    
    +0

    トップポストにはコメントできないので、ここでコメントします。最も一般的なIPを見つけるには、各IPの数をハッシュマップ、または(これはメモリが多すぎる可能性があるため)ディスク上のどこかに保持する必要があります。正規表現がどのようにしてより速く、最も一般的なIPを見つけるためにメモリを少なくするかはわかりません。 –

    +0

    コメントありがとうございます。私はそのように今見ている。 – Anand

    関連する問題