拆分要插入数据库的字符串

时间:2013-07-15 07:02:19

标签: python shell sed awk grep

我有一个包含大量此类行的文本文件。

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}'

这是分割字符串的正确方法吗? 有更好的选择吗?

2 个答案:

答案 0 :(得分:3)

如果您将关键字放在一个文件中,这将起作用:GNU 的代码:

 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

答案 1 :(得分: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()方法返回()括号内找到的字符串的元组。

请参阅http://docs.python.org/2/library/re.html

相关问题