#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’ очень удачно решает мою проблему. И после использования только этого я понял, что запрашивать «модуль» для такой тривиальной задачи, как эта, — это слишком с моей стороны :).