Регулярное выражение для извлечения предыдущей строки в файле журнала - PullRequest
2 голосов
/ 12 марта 2009

Мои файлы журналов содержат следующее:

2009-03-12T12:44:27+0000 something was logged
2009-03-12T12:45:36+0000 127.0.0.1 127.0.0.1 <auth.info> last message repeated 2 times

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

С учетом сказанного, кто-нибудь знает регулярное выражение, которое позволило бы мне извлекать обе строки всякий раз, когда обнаруживается оператор "последнее сообщение повторено ..."?

Ответы [ 4 ]

2 голосов
/ 12 марта 2009

Отредактировано для регулярного выражения 2 группы. Вы можете дать ему шанс: RegexLib

Меньше, чем оптимизировано, но это:

([\r\n].*?)(?:=?\r|\n)(.*?(?:last message repeated).*)

Должно работать, чтобы получить результаты из чего-то вроде этого:

2009-03-12T12:44:27+0000 something1 was logged
2009-03-12T12:44:27+0000 something2 was logged
2009-03-12T12:45:36+0000 127.0.0.1 127.0.0.1 <auth.info> last message repeated 2 times
2009-03-12T12:44:27+0000 something3 was logged
2009-03-12T12:44:27+0000 something4 was logged
2009-03-12T12:44:27+0000 something5 was logged
2009-03-12T12:45:36+0000 127.0.0.1 127.0.0.1 <auth.info> last message repeated 2 times

В результате:

Matches
First Match, First Group: 2009-03-12T12:44:27+0000 something2 was logged
First Match, Second Group: 2009-03-12T12:45:36+0000 127.0.0.1 127.0.0.1 <auth.info> last message repeated 2 times
Second Match, First Group: 2009-03-12T12:44:27+0000 something5 was logged 
Second Match, Second Group: 2009-03-12T12:45:36+0000 127.0.0.1 127.0.0.1 <auth.info> last message repeated 2 times
1 голос
/ 12 марта 2009

Должно ли это быть регулярное выражение? grep позволяет получить контекст до и после сопоставления (параметры -B NUM и -A NUM)

0 голосов
/ 12 марта 2009

Шаблон ^. * $ Соответствует целой строке. Перевод: начало строки, затем любое количество символов, за которым следует конец строки. Так что, возможно, вы можете найти «любую строку, за которой следует» (шаблон, который у вас есть).

0 голосов
/ 12 марта 2009

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

Примерно так (это слишком упрощенное регулярное выражение):

\n(.*)\n(.*)last message repeated

Теперь первое значение группы содержит интересующую вас строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...