使用Python解析大型journalctl文件以匹配关键字的有效方法

时间:2018-04-11 10:03:08

标签: python linux python-3.x

解析journelctl文件时,要查找的关键字是:error,boot,warning,traceback

一旦我遇到关键字,我需要为每个关键字增加计数器,并打印匹配行

所以,我试过如下;从文件中读取它并使用Collections模块 - Counter对象跟踪re.findall跟踪计数:

import re
from collections import Counter

keywords = [" error ", " boot ", " warning ", " traceback "]

def journal_parser():
    for keyword in keywords:
        print(keyword)  # just for debugging
        word = re.findall(keyword, open("/tmp/journal_slice.log").read().lower())
        count = dict(Counter(word))
        print(count)

以上解决方案解决了我的问题,但是我期待着有效的方式。

请告知。

2 个答案:

答案 0 :(得分:0)

这是一种更有效的方式:

def journal_parser(context):
    with open("/tmp/journal_slice.log") as f:
        data = f.read()
        words = re.findall(r"|".join(keywords), data, re.I) # case insensitive matching by passing the re.I flag (ignore case)
        count = dict(Counter(words))
        print(count)

答案 1 :(得分:0)

我不确定您的关键字周围是否还需要这些空格,具体取决于您的数据。但我认为在这里使用正则表达式和额外的库是不必要的导入。

keywords = ["error ", " boot ", " warning ", " traceback "]
src = '/tmp/journal_slice.log'
def journal_parser(s, kw):
    with open(s, 'r') as f:
        data = [w for line in f for w in line.split()]
        data = [x.lower() for x in data]
        print(data)
        for k in kw:
            print(f'{k} in src happens {data.count(k)} times')
journal_parser(src, keywords)

请注意,打印中的f-string格式在早期的3.x python中不起作用 以及转换为较低版本可能没有必要 - 可以将所有预期的案例添加到关键字 如果文件真的很大,你可以在列表中逐行产生并在每一行上做list.count(),就这种情况你必须跟踪你的计数