Alex2019
6.09.2019 - 18:27
Доброго времени всем!
Ребят, помогите разобраться как реализовать. Я новичек и для меня это сложное задание. Пол дня просидел с книгами и искал по форумам, и мануалам.
Форум обыскал, не нашел похожего.
Есть входной файл с логами: log.txt
В нем записаны разные события.
Нужно найти события alert1 и записать их в другой файл.
Файл имеет такую структуру:
alert1
рандомный текст
рандомный текст
рандомный текст
alert2
рандомный текст
рандомный текст
рандомный текст
alert1
рандомный текст
рандомный текст
рандомный текст
рандомный текст
рандомный текст
рандомный текст
Количество строк в alert1 может быть любое. разделителем между последним "рандомный текст" и следующим блоком инфы служат 3 переноса строки (CRLF CRLF CRLF)
Нужно выбрать все alert1 начиная со слова alert1 и заканчивая тремя CRLF, и записать их в log_result.txt
alert1 событий в файле может быть и 100 и 1000.
Сделал чтение файла, основная проблема с составлением правильного регулярного выражения и записью в другой файл.
Буду очень благодарен за помощь! Заранее спасибо!
Готов учиться на ваших примерах.
Цитата (Alex2019 @ 6.09.2019 - 17:27) |
Сделал чтение файла |
Он такой большой, что целиком в массив не вместится? Так и регулярка съест памяти дай боже.
Загнать в массив и в цикле удалить все элементы не-alert1. Или забрать все нужные.
_____________
Бесплатному сыру в дырки не заглядывают...
Alex2019
6.09.2019 - 20:03
Спасибо ребят! Хороших выходных.
Файл весом чуть более 7 Мб.
Alex2019
6.09.2019 - 20:54
https://pastebin.com/xn3M1s5LВот такой формат log-файлов.
Скрипт верно находит первое вхождение по маске, а потом копирует весь текст до конца файла.
Маска верная вроде. Возможно условие надо добавить?
Alex2019
6.09.2019 - 21:18
Огромное спасибо, добрый человек! Всё работает:-)
walerus
10.09.2019 - 19:14
Свои 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
10.09.2019 - 19:58
Можно сделать в "php-way" одной строкой. Но логи имеют свойство накапливаться :)
Пруф:
preg_match_all('/(alert1.+)(\r?\n{3}|$)/Us', file_get_contents('log.txt'), $match);
P.S. В идеале такое бы делать на sed/awk...
_____________
Чатик в телеге