2009-03-11 3 views
0

친애하는 모든, 나는 2 로그의 예는 다음과됩니다에 .gz 파일에서 EDIFACT 로그 메시지를 검색하는 파이썬 프로그램을 ... 쓰고 있어요 :그렙 정규 표현식을

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

Firefox 3.1b2에서는이 질문이 올바르게 렌더링되지 않습니다. 그것은 매우 넓고, 오른쪽으로 확장하여 전체 페이지가 수평 스크롤바가됩니다. – unwind

+0

나는 그것을 알아 냈다. 나는 즉시 텍스트를 수정하겠다. – wheisenberg

+0

Mac OS 10.5에서 3.0.7과 동일한 문제가 발생했다. – dmckee

답변

0

grep만으로는 이것이 불가능하다고 생각합니다. 이전 줄에서 일부 컨텍스트를 저장할 수 있으려면 awk 또는 perl을 제안합니다.

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

나는 정확한 구문의 특정 100 %입니다 : awk에서

#!/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'; 
    } 
} 

이런 식으로 뭔가를 제공합니다

perl에서이 같은 것을 제공합니다. 이것은 주로 원리를 설명하기위한 캔버스입니다.

+0

awk 명령에 대한 구문을 제안 할 수 있습니까? 첫 번째, 두 번째 및 세 번째 줄에서 몇 가지 요소 양식을 선택할 수 있습니까? 감사합니다 – wheisenberg

+0

죄송합니다, 귀하의 의견을 추가 할 때 펄 예제와 내 대답을 편집했다 ... – mouviciel

+0

awk 버전이 추가되었습니다. – mouviciel

1

확인이 이전 스레드, 당신은 당신이 찾고있는 답변을 얻을 수 있습니다 : bash grep newline

pcregrep 답변을 참조를 pcregrep -M 여러 라인을 일치시킬 수 있습니다.

관련 문제