首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python中的解析日志

python中的解析日志
EN

Stack Overflow用户
提问于 2021-03-02 15:22:07
回答 3查看 93关注 0票数 0

我试图在Python中解析一个日志文件,该文件包含数千行代码:

RAM 2822/3956 0MB(LFB106x4MB)交换107/1978MB (缓存0MB) IRAM 0/252 0MB(LFB252kB) CPU 24%@102,23%@204,关闭EMC_FREQ 3%@1600 VIC_FREQ 0%@76 VIC_FREQ 0%@140 APE 25 PLL@30C CPU@32 C PMIC@100 C GPU@31C AO@42.5C热@31.5C POM_5V_IN 2000/38 POM_5V_CPU 115/115

其中需要提取POM_5V_IN和POM_5V_CPU的值,分别为2000/2000和115/115。下面是我的代码,但是它不返回这些值。可能,我漏掉了一些使用regex语法的东西。

代码语言:javascript
复制
import re
newFile = open('datasets/consum_amt.log','r')
for line in newFile.readlines():
    if ('POM_5V_IN' in line): 
        P_in = re.compile(r'\{\"POM_5V_IN\" (0-9)\}')#parse POM IN
      
    else if ('POM_5V_CPU' in line):
        P_cpu = re.compile(r'\{\"POM_5V_CPU\" (0-9)\}')#parse POM CPU
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-03-02 15:57:40

这有用吗?

代码语言:javascript
复制
str1 = "RAM 2822/3956MB (lfb 106x4MB) SWAP 107/1978MB (cached 0MB) IRAM 0/252kB(lfb 252kB) CPU [24%@102,23%@204,off,off] EMC_FREQ 3%@1600 GR3D_FREQ 0%@76 VIC_FREQ 0%@140 APE 25 PLL@30C CPU@32C PMIC@100C GPU@31C AO@42.5C thermal@31.5C POM_5V_IN 2000/2000 POM_5V_GPU 38/38 POM_5V_CPU 115/115"

ind1a = str.find(str1, "POM_5V_IN", 0)
ind1b = str.find(str1, "POM_5V_GPU",0)
P_in = str1[ind1a+10, ind1b]  #Offsetting for length of "POM_5V_IN", could of course do that programmatically if you wanted

ind2 = str.find(str1, "POM_5V_CPU", 0)
P_cpu = str1[ind2+11:]  #Same offsetting as above

它依赖于POM_5V_IN值被字符串"POM_5V_GPU“跟踪,而POM_5V_CPU是字符串的最后一个条目,所以如果不是这样的话,就需要做一些工作。

票数 0
EN

Stack Overflow用户

发布于 2021-03-02 15:58:53

考虑到line为:

代码语言:javascript
复制
line = "RAM 2822/3956MB (lfb 106x4MB) SWAP 107/1978MB (cached 0MB) IRAM 0/252kB(lfb 252kB) CPU [24%@102,23%@204,off,off] EMC_FREQ 3%@1600 GR3D_FREQ 0%@76 VIC_FREQ 0%@140 APE 25 PLL@30C CPU@32C PMIC@100C GPU@31C AO@42.5C thermal@31.5C POM_5V_IN 2000/2000 POM_5V_GPU 38/38 POM_5V_CPU 115/115"

您可以对多个捕获组使用一个regex,如下所示:

代码语言:javascript
复制
import re
regex = re.compile(r"POM_5V_IN\s(?P<IN>[0-9]+/[0-9]+)\s.*POM_5V_CPU\s(?P<CPU>[0-9]+/[0-9]+)")

您可以像这样访问结果:

代码语言:javascript
复制
>>> regex.search(line).group('IN')
'2000/2000'
>>> regex.search(line).group('CPU')
'115/115'

捕获组的名称位于正则表达式中的<>之间。您可以使用正则表达式这里

票数 0
EN

Stack Overflow用户

发布于 2021-03-02 16:03:37

下面是一个应该有效的例子。

备注:

  • 如果不需要。else if在python中也是elif
  • 删除正则表达式中的花括号和额外引号。
  • 将内容更改为组捕获,以: 捕获一个或多个数字,后面是正斜杠,后面是一个或多个数字。
  • 在循环之前移动re.compile()语句,因为它们只需要发生一次

你的例子很接近。在用re.compile编译正则表达式之后,然后使用re.match()re.search()调用它。

代码语言:javascript
复制
import re
newFile = open('datasets/consum_amt.log','r')
P_in = re.compile(r'POM_5V_IN (\d+[/]\d+)')#parse POM IN
P_cpu = re.compile(r'POM_5V_CPU (\d+[/]\d+)')#parse POM CPU

for line in newFile.readlines():
    found_in = P_in.search(line)
    if found_in:
        print(found_in.groups()[0])
  
    found_cpu = P_cpu.search(line)
    if found_cpu:
        print(found_cpu.groups()[0])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66442168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档