1

アクセスログファイルを表現しようとしています。これを行うには、アクセスログファイルを1行ずつ読み取り、各行から有用な情報を抽出し、最終的にそれらをデータベースに追加します。

たとえば、行は次のようになります。

124.99.152.202 - naveen [22/Nov/2013:10:41:17 +1300] "GET /p/V4ZkA5d074CTy_vbFa7nLw,1385070078/IneedThisInteger/12.txt HTTP/1.1" "200" "3" "-" "Mozilla/5.0" "-"

IPアドレスを抽出する方法しか知りません(これを使用)

抽出したい

  1. このリクエスト値- GET /p/V4ZkA5d074CTy_vbFa7nLw,1385070078,IneedThisInteger/12.txt HTTP/1.1

  2. 上記の部分からのこの整数値- IneedThisInteger

  3. このステータス部分-200

  4. このバイト部分-3

リクエスト URL の最後の部分が変更されることがあります。

"GET /p/V4ZkA5d074CTy_vbFa7nLw,1385070078,IneedThisInteger/FOLDER/12.txt HTTP/1.1"
"GET /p/V4ZkA5d074CTy_vbFa7nLw,1385070078,IneedThisInteger/FOLDER/ANOTHER FOLDER/12.txt HTTP/1.1"
"GET /p/V4ZkA5d074CTy_vbFa7nLw,1385070078,IneedThisInteger/FOLDER/ANOTHER FOLDER/HEREIS-ANOTHER-FOLDER-AND-SO-ON/12.txt HTTP/1.1"

したがって、各行からこれらの値を取得するための安定した方法が本当に必要です。どうすればよいですか?

4

2 に答える 2

1

これでうまくいくはずです:

^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}).*?"(.*?/p/.*?,\d+,(\d+).*?)" "(\d+)" "(\d+)".*$

デモ用のフィドルは次のとおりです。 http://www.rexfiddle.net/3sDwWut

テスト目的で「I NEED THIS INTEGER」を実際の数値に置き換え、「バイト」と IP アドレスを少しランダム化しました。これらは順番にキャプチャされます:

  1. IP
  2. リクエスト(例GET xxx HTTP/1.1
  3. 必要な URL の整数
  4. HTTP ステータス
  5. バイト数
于 2013-11-21T22:28:46.743 に答える
1

常に GET リクエストを行っていると仮定すると、これでうまくいくはずです。

"(GET /.*?/.*?,\d+,(\d+)/.*?)"\s"(\d+)"\s"(\d+)"

式の説明については、regex101.comを参照してください。

于 2013-11-21T22:20:22.300 に答える