2013-11-21 46 views
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地址。(使用this

我想提取

  1. 這一請求從上面值 - GET /p/V4ZkA5d074CTy_vbFa7nLw,1385070078,IneedThisInteger/12.txt HTTP/1.1

  2. 該整型值part-IneedThisInteger

  3. 此狀態本部200

  4. 這個字節本部3

有時會要求網址更改它的最後一部分

"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" 

所以我真的需要一個穩定的方式來獲得這些值來自每條線。我該怎麼做?

+0

那麼你選擇適當的標記來回答你的問題:使用正則表達式 – kero

+2

@kingkero問題是如何使用正則表達式來做到這一點,我嘗試使用在線如上所述,但失敗了。 –

回答

1

這應該做的伎倆:

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

這裏有一個小提琴證明:http://www.rexfiddle.net/3sDwWut

我換成你「我需要這個INTEGER」以用於測試目的的實際數量,並且還隨機化「字節「和IP地址一點點。這些都是捕獲​​,依次是:

  1. 的IP
  2. 的請求(例如GET xxx HTTP/1.1
  3. 的與你想要
  4. HTTP狀態的URL整數
  5. 字節計數
+0

這是偉大的,但我不知道你是如何做到這一點。謝謝SpikeX –

1

假設你總是有GET請求,這應該做的伎倆

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

的表達的說明,請參見regex101.com