2013-07-15 144 views
0

我有一個很多這樣的行的文本文件。拆分字符串插入數據庫

Jul 15 12:12:51 whitelist logger: 1|999999999999|id:d9faff7c-4016-4343-b494-37028763bb66 submit date:1307130919 done date:1307130919 stat:DELIVRD err:0|L_VB3_NM_K_P|1373687445|vivnel2|L_VB3_GH_K_P|promo_camp1-bd153424349bc647|1 

我需要在數據庫中插入值,因此我需要分開的值。

1) logger 
2) submit date 
3) done date 
4) stat 
5) err 

以下是工作分離記錄器字符串。

tail messages | grep logger: | awk -F'logger: ' '{print $2}' | awk '{print $1}' 

這是分割字符串的正確方法嗎? 有更好的選擇嗎?

+0

蟒蛇?使用正則表達式 –

+1

您的腳本將爲「記錄器」輸出'1 | 999999999999 | id:d9faff7c-4016-4343-b494-37028763bb66'。那是你要的嗎?顯示樣本輸入的預期輸出,並添加另外幾行樣本輸入以幫助闡明您的要求。 –

回答

1

有很多方法可以在Python中完成此操作。一種簡單的方法是使用Python內置的正則表達式。假設日誌輸出始終遵循的規則所提到的,你可以提取所關注的部分是這樣的:

import re 

s = "Jul 15 12:12:51 whitelist logger: 1|999999999999|id:d9faff7c-4016-4343-b494-37028763bb66 submit date:1307130919 done date:1307130919 stat:DELIVRD err:0|L_VB3_NM_K_P|1373687445|vivnel2|L_VB3_GH_K_P|promo_camp1-bd153424349bc647|1" 

logger_re = re.compile(
"logger: ([^ ]+)\ 
submit date:(\d+)\ 
done date:(\d+)\ 
stat:(.+)\ 
err:(.+)$") 

print logger_re.search(s).groups() 

的.groups()方法返回的()括號內找到的字符串的元組。對於GNU 代碼:

http://docs.python.org/2/library/re.html

+0

這正是我所期待的。謝謝。在比較其他答案後,我會接受答案。 – shantanuo

+0

如何在開始時選擇日期? 「白名單」之前的文字 – shantanuo

3

如果你把關鍵詞在文件中,這將工作

sed -nr 's#.*#h;s/.*(&):\\s*(\\w+).*/\\1:\\2/p;g#p' file2|sed -nrf - file1 

例子:

 
$ cat file1 
Jul 15 12:12:51 whitelist logger: 1|999999999999|id:d9faff7c-4016-4343-b494-37028763bb66 submit date:1307130919 done date:1307130919 stat:DELIVRD err:0|L_VB3_NM_K_P|1373687445|vivnel2|L_VB3_GH_K_P|promo_camp1-bd153424349bc647|1 

$ cat file2 
logger 
submit date 
done date 
stat 
err 

$ sed -nr 's#.*#h;s/.*(&):\\s*(\\w+).*/\\1:\\2/p;g#p' file2|sed -nrf - file1 
logger:1 
submit date:1307130919 
done date:1307130919 
stat:DELIVRD 
err:0