Я пытаюсь собрать конкретную информацию из очень больших файлов журнала, но не могу понять, как получить нужное мне поведение.
Для справки пример журнала выглядит примерно так:
garbage I don't need - garbage I don't need
timestamp - date - server info - 'keyword 1' - data
more data more data more data more data
more data more data more data more data
more data more data 'keyword 2' - last bit of data
garbage I don't need - garbage I don't need
Мне нужно найти «ключевое слово 1», захватить всю строку, ключевое слово 1 включено (вернуться к отметке времени) и все последующие строки до (и включая) всей строки, в которой включено «ключевое слово 2» (до последнего немного данных).
Пока что я попробовал несколько вещей. Я не могу получить приличные результаты с помощью методов re (findall, match, search и т. Д.); Я не могу понять, как получить данные перед совпадением (даже с оглядкой назад), но что более важно, я не могу понять, как сделать так, чтобы захват остановился на фразе, а не на одном символе.
for match in re.findall('keyword1[keyword2]+|', showall.read()):
Я тоже пробовал что-то вроде этого:
start_capture = False
for current_line in fileName:
if 'keyword1' in current_line:
start_capture = True
if start_capture:
new_list.append(current_line)
if 'keyword2' in current_line:
return(new_list)
Независимо от того, что я пытался, это вернуло пустой список
Наконец, я попробовал что-то вроде этого:
def takewhile_plus_next(predicate, xs):
for x in xs:
if not predicate(x):
break
yield x
yield x
with lastdb as f:
lines = map(str.rstrip, f)
skipped = dropwhile(lambda line: 'Warning: fatal assert' not in line, lines)
lines_to_keep = takewhile_plus_next(lambda line: 'uptime:' not in line, skipped)
В этом последнем документе все содержалось от ключевого слова 1 до EOF, которое включает почти 100 000 строк данных для мусора.