2013-06-25 2 views
1

Есть проблемы в настройке регулярного выражения для матча многострочногоPerl REGEX, чтобы соответствовать Mutiple линии

Am пытаюсь захватить все неудачные запросы (получить статус 2) без успеха

Perl одна строки выглядит

perl -e '$text = `cat errors.log`;while($text =~ m/^request.*?(\/.*?)\n.*?receive status is 2$/sgm){print $1."\n";}' 

образец журнала выглядит следующим образом

***** test 0: ***** 
* Request: 
request = /Lookup?url=URL1 

received in 0.108 milliseconds 
receive status is 2 
-- STATUS : 1 -- 
     <RESULT SET 1> 


***** test 1: ***** 
* Request: 
request = /Lookup?url=URL2 

received in 44.753 milliseconds 
receive status is 0 
-- STATUS : 0 -- 
     <RESULT SET 2> 


***** test 2: ***** 
* Request: 
request = /Lookup?url=URL3 

received in 44.753 milliseconds 
receive status is 2 
-- STATUS : 3 -- 
     <RESULT SET 3> 

Глядя на захват все URL-адреса, которые не смогли как url1, URL3

ответ

3

Вы никогда не должны использовать

`cat errors.log` 

в Perl. Чтение файлов - это то, что просто и эффективно в Perl, поэтому изучите его.

perl -lnwe 'BEGIN { $/= $/x3 } if (/receive status is 2/) 
      { print /request\s*=\s*(.+)/ }' errors.log 

Объяснение:

  • -n будет рассматривать аргументы в сценарий в качестве аргументов имя файла и открыть эти файлы для чтения.
  • -l будет обрабатывать концы строк (для печати здесь)
  • Кода внутри BEGIN устанавливает входной разделитель для трех новых строк (или независимо от вашей ОС используется), что позволяет нам читать входной файл в кусках, читать вверх до трех последовательных строк новой строки.

А остальное просто два простых регулярных выражения. Поскольку мы потратили некоторое время на то, чтобы сохранить куски отдельно, теперь мы можем использовать более простые регулярные выражения.

Выход:

/Lookup?url=URL1 
/Lookup?url=URL3 
0

Это также просто с немного состояние:

perl -lne '$last = $1 if /request = (.+)/; print $last if /^receive status is 2/' errors.log 

Сохранение весь журнал в памяти становится менее желательно, так как журнал становится больше. И журналы имеют способ быть достаточно крупными.

+0

Это просто круто :) может добавить больше фильтров и захватить whataver, я хочу, как только у нас произошли сбои сегментов – Shashi

+1

Спасибо TLP, Daniel и все мысли, чтобы узнать, отметят этот квест для будущего refrence :) – Shashi