Какой-нибудь модуль Perl для повторяющегося поиска и извлечения содержимого файла?

#perl

#perl

Вопрос:

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

Комментарии:

1. Если это можно сделать с помощью базового скрипта, какой смысл писать модуль?

2. Привет, Мэт, я не хочу писать модуль, а просто проверяю, есть ли какой-нибудь модуль, предназначенный для такого рода действий, который дает больше возможностей и контроля.

Ответ №1:

Вероятно, такого модуля нет, потому что код довольно тривиален, а другие детали довольно специфичны для конкретной проблемы.

У меня была подобная проблема много раз. Ввод был примерно таким:

 Date: 2011-11-10
<an interesting line>
<another interesting line>
Date: 2011-11-11
<more interesting lines>
  

И мне нужно было извлечь все «интересные строки», зная дату для каждой. Я думаю, что oneliners или короткие одноразовые скрипты были очень успешны для этой цели. В oneliners полезно быть знакомым с такими полезными вещами, как -l и -a . perl -wlane '...' это то, что я писал тысячу раз.

Ответ №2:

Вы могли бы взглянуть на cgrep , который является примером именно такого типа обработки. Его можно использовать в конвейере, т.е.

 cat mylog | cgrep -w0:1 'regexp' | grep -v 'regexp' | sed 's/.../.../'
  

Другими словами, grep для регулярного выражения, выводящий 0 строк до совпадения и одну после, затем удаляющий исходные совпадения и форматирующий результат. Возможно, вы не захотите использовать sed для последнего шага, это просто пример.

cgrep появляется в самых ранних изданиях книги Programming Perl (Camel). Его довольно легко найти.

Ответ №3:

Спасибо, что предложили другие варианты. На самом деле я обнаружил, что использование оператора ‘flip-flop’ с ‘if’ очень удачно решает мою проблему. И после использования только этого я понял, что запрашивать «модуль» для такой тривиальной задачи, как эта, — это слишком с моей стороны :).