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

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

4

2 回答 2

3

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

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

例子:

$猫文件1
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

$猫文件2
记录器
提交日期
完成日期
统计
呃

$ sed -nr 's#.*#h;s/.*(&):\\s*(\\w+).*/\\1:\\2/p;g#p' file2|sed - nrf - 文件 1
记录器:1
提交日期:1307130919
完成日期:1307130919
统计:DELIVRD
错误:0

于 2013-07-15T10:03:30.757 回答
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

于 2013-07-15T07:49:14.810 回答