Как использовать фрагменты файлов на основе символов вместо строк для grep? - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь проанализировать файлы журналов следующей формы:

---
metadata1=2
data1=2,data3=5
END
---
metadata2=1
metadata1=4
data9=2,data3=2, data0=4
END

Каждый раздел между --- и END является записью. Я хочу выделить всю запись, содержащую такое поле, как data1. Мне удалось решить эту проблему с помощью следующей команды, но она очень медленная.

pcregrep -M '(?s)[\-].*data1.*END' temp.txt

Что я здесь делаю не так?

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Я бы использовал awk:

awk 'BEGIN{RS=ORS="END\n"}/\ydata1/' file

Объяснение:

awk работает на основе ввода записей . По умолчанию такая запись является строкой ввода, но это поведение можно изменить, установив разделитель записи разделитель записи вывода для вывода).

Установив для них значение END\n, мы можем искать все записи вашего ввода.

Регулярное выражение /\ydata1/ ищет в этих записях наличие термина data1, \y соответствует слову граница, чтобы предотвратить совпадение metadata1.

1 голос
/ 05 мая 2020

Разбор этого файла с помощью pcregrep может оказаться сложной задачей. «Pcregrep» не имеет возможности разбивать файлы на логические записи. Шаблон, который был указан c, попытается найти совпадающие записи путем объединения нескольких записей вместе. Иногда включение несопоставленных записей в вывод.

Например, если ввод - «--- data = a END --- data1 = a END», то вышеуказанная команда выберет обе записи, так как это будет сформировать соответствие между начальным '---' и завершающим 'END'

Для этого типа ввода рассмотрите возможность использования AWK. Он имеет возможность читать ввод с помощью настраиваемого разделителя записей (RS), который упрощает преобразование ввода в записи и применение шаблона. При желании вы можете использовать Perl или Python.

Использование awk RS для создания «записей», можно применить тест шаблона к каждой записи

awk -v RS='END\n' '/data1/ { print $0 }' < log1 
awk -v RS='END\n' '/data1/ { print NR, $0 }' < log1 

Вторая команда включает номер записи в вывод, если это полезно.

Хотя AWK не так быстр, как pcregrep, в этом случае у него не будет проблем с обработкой большого входного набора.

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