Найти - Пользователи
Полная версия: Поиск по шаблону в очень большом файле
Начало » Python для экспертов » Поиск по шаблону в очень большом файле
1 2 3
Budulianin
Master_Sergius
Что за чит?

C:\>systeminfo
Имя узла:                         2008
Название ОС:                      Microsoft Windows Server 2008 R2 Standard
Версия ОС:                        6.1.7600 Н/Д сборка 7600
Изготовитель ОС:                  Microsoft Corporation
Master_Sergius
Но ведь на винде нету утилит типа cat и grep, это установленный какой-то пакет а-ля набор линуксовых утилит?

Хм… кажется, мне удалось найти то, что нужно, это есмь либа mmap, надо познакомиться поближе…

Budulianin
Master_Sergius
Но ведь на винде нету утилит типа cat и grep, это установленный какой-то пакет а-ля набор линуксовых утилит?

Какая тебе разница нативные они или нет? Главное это показывает, что их достать можно.
А вообще, я ничего не ставил на эту машину, скорее всего изначально есть в этой версии

В инете пишут, что в винде есть findstr - подобие grep
py.user.next
Master_Sergius
Использовать grep хотелось бы
Master_Sergius
Читать построчно - тоже не идёт, ибо регулярки всякие бывают - может быть такой шаблон, что совпадёт кусок, который состоит из 50 строк, а то и более…
Master_Sergius
Иногда, эти куски могут занимать несколько строк.
grep не может в нескольких строках сразу искать
sed может искать, но у него небольшие буферы, гарантируются 8KiB

Master_Sergius
Что за чит? С линукса монтировать виндовый раздел? Это плохой вариант…
не, ставится msys, а туда grep

Master_Sergius
Есть много разных програм, которые постоянно пишут в логи что-то…
они пишут в разные логи, каждый из которых по 100MiB ?
Master_Sergius
py.user.next
grep не может в нескольких строках сразу искать
Я проверял на таких регулярках типа grep -E “some begin mark(\s|\S)*some end mark” - и находило
возможно, я не так выразился

py.user.next
они пишут в разные логи, каждый из которых по 100MiB ?
Нет, бывают разные случаи. Есть логи по пару килобайт, есть логи по гигу…

—-

Поковырялся с mmap - в общем почти то, что нужно. На 32-х битных архитектурах можно обрабатывать файлы до 4 гб - единственный минус. Но, пока что этого достаточно…
py.user.next
Master_Sergius
регулярках типа
grep -E "some begin mark(\s|\S)*some end mark"
- и находило
оно ищет в одной строке

1. берёт строку
2. ищет в ней совпадение с регулярным выражением
3. если есть, выводит строку
4. переходит к пункту 1

Master_Sergius
возможно, я не так выразился
не, скорее всего, ты не понимаешь, как работает grep
ей всё равно в каком порядке строки

[guest@localhost ~]$ echo -e "a b c\nb c d"
a b c
b c d
[guest@localhost ~]$ echo -e "a b c\nb c d" | grep -E 'a.+d'
[guest@localhost ~]$
Master_Sergius
Да, действительно. Я нашел ошибку у себя… Фокус был в том, что там превращали файлы в одну строку, а Я повелся )
Что ж… Получается, что то, что мне нужно и есть mmap, пока что тестил на одном продукте - всё работает.
Но если знаете ещё решения, буду рад увидеть их здесь…

Всё-таки нужны подсказки… И это решение не есмь универсальное. Попробовали тестить на разных продуктах, оказалось на freebsd вылазиет еррор:
match = pattern.search(data)
RuntimeError: maximum work per expression/data limit exceeded

На винде и на линухе всё ок. А вот на фришке появляется еррор - но это только когда очень большие файлы, over 1 gb…
Эх, что же делать…
py.user.next
приведи конкретный пример небольшого лога и того, что из него нужно выбрать
можешь три разных примера привести
а то непонятно, что именно ты делаешь и складывается впечатление, что ты сам не знаешь точно
а от правильно сформулированной цели зависит вся последующая реализация
Master_Sergius
Да всё понятно - грубо говоря - есть файлы, и надо убедиться, что там есть совпадения по регулярках.

Но, на всяк случай, вот пожалуйста, пусть будет пример
2013-11-06 08:24:09      1.1.0.14-015               290
2013-11-06 08:24:07 1.1.0.14-014 290
2013-11-06 08:24:06 1.1.0.14-013 290
2013-11-06 08:24:04 1.1.0.14-012 290
2013-11-06 08:24:03 1.1.0.14-011 290
2013-11-06 08:24:01 1.1.0.14-010 290
2013-11-06 08:24:00 1.1.0.14-009 290
2013-11-06 08:23:58 1.1.0.14-008 290
2013-11-06 08:23:57 1.1.0.14-007 290
2013-11-06 08:23:55 1.1.0.14-006 290

И в данном случае, надо убедиться, что в первой колонке - формат даты соответсвует нуждам, тобишь, без регулярки никак. Естественно, этот пример подходит под одну строку.
Но вот, другой кусок (нечто вынужден заменить ХХХ - типа секретная инфа ):

INFO: Run script with options:
XXX
INFO: OK
DEBUG: XXX
INFO: Run script with options:
XXX
INFO: ERROR

Вот здесь надо убедиться, что скрипт с такими-то опциями прошел успешно. А здесь, как видно, оно разбито по строкам. Естественно напрашивается соответсвуюшая регулярка…
Budulianin
Master_Sergius
А здесь, как видно, оно разбито по строкам

А найти закономерность и обрабатывать построчно не можешь что ли ?

Например, если попалась строка INFO: Run script with options:, то следующую обрабатываем, т.к. там дата
Ну или что-то подобное, не знаю, что у тебя там конкретно
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB