Выражение регулярного выражения для выбора пары строк

У меня есть лог-файл. Общий формат

log text 1  <br/>
log text 2  <br/>
Error: xxxxxx  <br/>
error description (1 line only)  <br/>
log text 3 <br/>
log text 4  <br/>
....  <br/>
Error: xxxxxx  <br/>
error description (1 line only)  <br/>
log text 5  <br/>
....  <br/>

Я хотел бы выбрать и извлечь пару из 2 строк, содержащих ошибки (каждая ошибка имеет две строки. В первой строке всегда есть ошибка: как ключевое слово. Ошибка слова не встречается больше нигде в лог-файле).

Как мне сделать это с помощью регулярных выражений или любым другим способом. Я могу использовать MacOS, Unix или Windows XP. MacOS предпочтительнее.

2 ответа

Решение

Использование grep на ОС Mac или Unix

grep -i error -A2 inputfile

Например, регулярное выражение для поиска этих двух строк:

^.*?Error.*(?:\r?\n|\r).*$

^... начать каждый поиск в начале строки.

.*?... соответствует любому символу, кроме возврата каретки и перевода строки ноль или более раз без жадности. Не жадность означает как можно меньше символов. Другими словами, остановитесь на первом появлении Error и не в последний раз.

Error... это слово должно быть найдено в первой из 2 строк, чтобы соответствовать.

.*... соответствует любому символу, кроме возврата каретки и перевода строки ноль или более раз по жадности. Жадность означает, что теперь соответствует столько персонажей, сколько возможно.

(?:\r?\n|\r)... - это группа без пометки, соответствующая либо возврату каретки + перевод строки (текстовые файлы DOS/Windows), либо только перевод строки (текстовые файлы UNIX), либо только возврат каретки (старый текстовый файл MAC).

.*... соответствует любому символу, кроме возврата каретки и перевода строки 0 или более раз жадным образом.

$... якорь для конца строки. Окончание строки не входит в согласованную строку.

Другими словами, это выражение соответствует всей строке, содержащей где-либо слово Error, разделитель строки в этой первой строке и все элементы на следующей строке до конца строки, но не совпадающие также с разделителем строки этой второй строки.

UltraEdit - это условно-бесплатный текстовый редактор, доступный для Windows, Linux и Mac.

Использование этого регулярного выражения Perl в диалоге поиска - поиска UltraEdit с опцией расширенного поиска Список строк, содержащий включенные строки, приводит к получению всех найденных двухстрочных строк, записанных в окно со списком всех найденных строк.

Открытие контекстного меню этого окна (щелчок правой кнопкой мыши по Windows) и нажатие кнопки " Копировать в буфер обмена" приводит к копированию всех найденных строк в системный буфер обмена.

Нажатие Ctrl+N, чтобы открыть новый файл, Ctrl+V, чтобы вставить скопированные строки, и Ctrl+S, чтобы сохранить новый файл, и, наконец, получить файл с нужной информацией.

Другой метод - использование сценария UltraEdit FindStringsToNewFile с сокращенной строкой поиска регулярного выражения. Error.*(?:\r?\n|\r).*, Этот скрипт записывает все найденные строки, начиная с ключевого слова Error и заканчивается в конце следующей строки непосредственно в новый файл.

Еще одна заметка:

Если . (точка) соответствует также символам новой строки, таким как возврат каретки и перевод строки зависит от флага. В UltraEdit по умолчанию установлен флаг, что точка не соответствует символам новой строки. С (?s) в начале строки поиска регулярного выражения Perl флаг изменяется, и точка затем будет соответствовать символам новой строки для этого поиска. С (?-s) в начале строки поиска флаг может быть установлен для несоответствия символов новой строки точкой, если внутреннее значение по умолчанию для приложения противоположное.

Другие вопросы по тегам