Эффективный способ синтаксического анализа большого файла journalctl на соответствие ключевым словам с помощью python

При анализе файла journelctl необходимо искать следующие ключевые слова: ошибка, загрузка, предупреждение, обратная трассировка.

Как только я встречаю ключевое слово, мне нужно увеличить счетчик для каждого ключевого слова, а также распечатать соответствующую строку.

Итак, я попробовал, как показано ниже; чтение его из файла и использование модуля 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)

Вышеупомянутое решение решает мою проблему, однако я с нетерпением жду более эффективного способа, если таковой имеется.

Пожалуйста, порекомендуйте.

Я думаю, что вы слишком усложняете, используя re; Я занят, через некоторое время отправлю ответ, если никто не сделает этого :)

Drako 11.04.2018 12:10
1
1
211
2

Ответы 2

Вот более эффективный способ:

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)

есть опечатка :) для слова и слов - пробовал редактировать - требуется не менее 6 символов: D

Drako 11.04.2018 12:30

@Kasramvd: круто :) как я могу использовать ту же логику, чтобы вернуть совпадающую строку?

user8557159 12.04.2018 08:32

@ Ash_23 В этом случае вместо того, чтобы читать весь файл сразу, вы должны читать файл построчно и применять регулярное выражение к каждой строке. Это все.

kasravnd 12.04.2018 09:39

Я не уверен, что вам все еще нужны эти пробелы вокруг ключевых слов, зависит от ваших данных. Но я думаю, что использование регулярных выражений и дополнительных библиотек здесь - ненужный импорт.

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-строки в печати не работает в ранних версиях Python 3.x. также может не потребоваться преобразование в более низкий - можно просто добавить все ожидаемые случаи к ключевым словам и если файл действительно огромен, вы можете вводить построчно в списке и делать list.count () в каждой строке, только в этом случае вам нужно отслеживать свои подсчеты

list имеет метод count, который вы можете и, как я думаю, должны использовать :)

Drako 12.04.2018 08:15

Другие вопросы по теме