解析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)
以上解决方案解决了我的问题,但是我期待着有效的方式。
请告知。
答案 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(),就这种情况你必须跟踪你的计数