2013-07-15 102 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