[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Парсер для текстовых логов
Alex2019
Доброго времени всем!

Ребят, помогите разобраться как реализовать. Я новичек и для меня это сложное задание. Пол дня просидел с книгами и искал по форумам, и мануалам.
Форум обыскал, не нашел похожего.

Есть входной файл с логами: log.txt

В нем записаны разные события.
Нужно найти события alert1 и записать их в другой файл.

Файл имеет такую структуру:



alert1
рандомный текст
рандомный текст
рандомный текст


alert2
рандомный текст
рандомный текст
рандомный текст


alert1
рандомный текст
рандомный текст
рандомный текст
рандомный текст
рандомный текст
рандомный текст

Количество строк в alert1 может быть любое. разделителем между последним "рандомный текст" и следующим блоком инфы служат 3 переноса строки (CRLF CRLF CRLF)
Нужно выбрать все alert1 начиная со слова alert1 и заканчивая тремя CRLF, и записать их в log_result.txt

alert1 событий в файле может быть и 100 и 1000.

Сделал чтение файла, основная проблема с составлением правильного регулярного выражения и записью в другой файл.
Буду очень благодарен за помощь! Заранее спасибо!
Готов учиться на ваших примерах.
brevis
https://glot.io/snippets/ffqe3xdbjf

_____________
Чатик в телеге
FatCat
Цитата (Alex2019 @ 6.09.2019 - 17:27)
Сделал чтение файла

Он такой большой, что целиком в массив не вместится? Так и регулярка съест памяти дай боже.
Загнать в массив и в цикле удалить все элементы не-alert1. Или забрать все нужные.

_____________
Бесплатному сыру в дырки не заглядывают...
Alex2019
Спасибо ребят! Хороших выходных.

Файл весом чуть более 7 Мб.
Alex2019
Цитата (brevis @ 6.09.2019 - 19:36)
https://glot.io/snippets/ffqe3xdbjf

https://pastebin.com/xn3M1s5L

Вот такой формат log-файлов.

Скрипт верно находит первое вхождение по маске, а потом копирует весь текст до конца файла.
Маска верная вроде. Возможно условие надо добавить?
brevis
regexp надо чуть поправить: https://glot.io/snippets/ffqgm74v0n

_____________
Чатик в телеге
Alex2019
Цитата (brevis @ 6.09.2019 - 21:07)
regexp надо чуть поправить: https://glot.io/snippets/ffqgm74v0n

Огромное спасибо, добрый человек! Всё работает:-)
walerus
Свои 5ть копеек.

$fin = file_get_contents('log.txt');

$fin = explode("\n\n", $fin);

$result = [];

foreach( $fin as $fin_line ){
if ( strstr($fin_line, 'alert1') ){
$result[] = $fin_line;
}
}


print_r($result);
brevis
Можно сделать в "php-way" одной строкой. Но логи имеют свойство накапливаться :)

Пруф:
preg_match_all('/(alert1.+)(\r?\n{3}|$)/Us', file_get_contents('log.txt'), $match);


P.S. В идеале такое бы делать на sed/awk...

_____________
Чатик в телеге
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.