2009-03-11 4 views
0

Уважаемые все, я пишу питон программу, получение сообщений журнала ЭДИФАКТА из файла .gz ... Примера 2 журналов являются следующим:Grep регулярных выражений на несколько строках

2009/03/02 12:13:59.642396 siamp102 mux1-30706 Trace name: MSG 
Message sent [con=251575 (APEOBEinMux1), len=2106, CorrID=000182C42DE0ED] 
UNB+IATB:1+1ASRPFA+1A0APE+090302:1213+0095JQOL2 

2009/03/02 12:14:00.029496 siamp102 mux1-30706 Trace name: MSG 
Message sent [con=737 (APIV2_1), len=22370, CorrID=000182C42DE0ED] 
UNB+IATB:1+1ASIFQLFS+1ARIOFS+090302:1214+0122V11ON9 

Я хотел бы написать регулярное выражение, способное сопоставить какое-то поле с первой строкой, некоторые из второго и некоторые другие из третьего ...

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

Заранее благодарен!

+0

Aargh, этот вопрос не правильно отображается в Firefox 3.1b2. Это ультра-широкий, простирающийся вправо и делая всю страницу горизонтальной полосой прокрутки. – unwind

+0

Я заметил это ... Я сразу же внесу текст – wheisenberg

+0

Та же проблема в 3.0.7 на Mac OS 10.5 intel – dmckee

ответ

0

Только grep, я думаю, что это невозможно. Я бы предложил awk или perl, чтобы иметь возможность сохранить какой-либо контекст из предыдущих строк.

В perl это дает что-то вроде:

#!/usr/bin/env perl 

$isInLogSection = 'NO'; 
while (<>) { 
    if (/siamp102/) { 
     # Start of log section: retrieve its ID 
     $isInLogSection = 'YES'; 
     split; 
     $logSectionID = $_[0]; 
    } 

    if ($isInLogSection eq YES && /len=/) { 
     # Retrieve value of len 
     ... 
    } 

    if (/^$/) { 
     # End of log section 
     $isInLogSection = 'NO'; 
    } 
} 

В awk это дает что-то вроде:

BEGIN { isInLogSection = "NO"; } 
/siamp102/ { isInLogSection = "YES"; logSectionID = $1; } 
/len=/ { if (isInLogSection == "YES") { #retrieve len value } } 
/^$/ { isInLogSection = "NO" } 

Я не 100% уверен, точный синтаксис. Это, в основном, полотно для иллюстрации принципов.

+0

Можете ли вы предложить мне синтаксис команды awk, способный выбрать какую-либо форму элемента первой, второй и третьей строки? Спасибо – wheisenberg

+0

К сожалению, когда вы добавили свой комментарий, я редактировал свой ответ с помощью примера perl ... – mouviciel

+0

Добавлена ​​версия awk. – mouviciel

1

Проверить это предыдущая нить, вы могли бы получить ответ, который вы ищете: bash grep newline

ВИДЕТЬ pcregrep ответ, pcregrep -M позволяет использовать несколько линий, чтобы соответствовать.

Смежные вопросы