我有一个包含大量此类行的文本文件。
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 :(得分:3)
如果您将关键字放在一个文件中,这将起作用:GNU sed的代码:
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()方法返回()
括号内找到的字符串的元组。