2013-11-27 35 views
0

我在Python中使用sed将日志文件中的文本读入单个字符串。解析可变长度python字符串的成员

下面是一个命令:

sys_output=commands.getoutput('sed -n "/SYS /,/Tot /p" %s.log' % cim_input_prefix) 

,这里是sys_output

SYS SCFTYP METHOD  NC NO NU NBS MEMORY CPU TIME  
    1 RHF  CCSD  18 21 59 89  92  1.6163 
    2 RHF  CCSD  4 7 22 36  2  0.0036 
Tot            94  1.6199 
SYS SCFTYP METHOD  NC NO NU NBS MEMORY CPU TIME 
    1 RHF  CCSD  4 4 14 19  1  0.0002 
Tot            1  0.0002 
SYS SCFTYP METHOD  NC NO NU NBS MEMORY CPU TIME 
    1 RHF  CCSD  4 9 36 55  8  0.0416 
    2 RHF  CCSD  18 25 73 108  200  5.3587 
    3 RHF  CCSD  4 10 29 48  6  0.0217 
Tot           214  5.4221 

其中有三组,[2,1,3]行感兴趣的打印输出。

我的脚本遇到的日志文件可能有可变数量的组和行,所以我不能简单地拆分字符串并提取有用的信息。

我对组和行以及内存列的索引感兴趣。

如何可以解析这个大串获得一本字典,如:

{'1-1': 92, '1-2': 2, '2-1': 1, '3-1': 8, '3-2': 200, '3-3': 6}? 

非常感谢您的宝贵时间

+2

你有没有尝试过的东西? – slider

+0

我已经尝试将sys_output保存到文本文件,并通过查找以整数开头的行数来保存子系统数的计数。我可以用子系统的数量来表示内存价值的指数,如果我可以通过类似的方法计算出有多少个grups。 – keipertk

+0

为什么不能使用split来获取信息?我认为它会工作。 – aIKid

回答

1

一些样的状态机的基础上,输出的特定特征可能让生活更容易,而不是过于担心指数。

该代码片段适用于该示例,可以定制用于处理角落案例。

import collections 

with open("cpu_text", "r") as f: 
    lines = f.readlines() 

lines = [line.strip() for line in lines] 

group_id = 0 
group_member_id = 0 
output_dict = collections.OrderedDict() 

for line in lines: 
    if line.find("SYS") > -1: 
     group_id += 1 
    elif line.find("Tot") > -1: 
     group_member_id = 0 
    else: 
     group_member_id += 1 
     key = "{0}-{1}".format(group_id, group_member_id) 
     memory = line.split()[7] 
     output_dict[key] = memory 

print(output_dict) 

输出:

OrderedDict([('1-1', '92'), ('1-2', '2'), ('2-1', '1'), ('3-1', '8'), ('3-2', '200'), ('3-3', '6')]) 
+0

这非常有帮助,并且是解决问题的有用方法。非常感谢。 – keipertk