2008-10-01 9 views
2

현재 "."와 일치하는 문자열에 대해 Exim 로그 파일을 구문 분석하는 간단한 .sh 스크립트를 작성하고 있습니다. 현재 output.txt를 볼 때 모든 행에 0이 인쇄됩니다 (606 행). awk이 오류를 던지지 않기 때문에 내 논리가 잘못되었다고 생각합니다.Awk 스크립팅 도움 - 논리 문제

내 코드 (연결 및 카운터 문제로 업데이트 됨)는 다음과 같습니다. 편집 : 나는 dmckee의 대답에서 몇 가지 새로운 코드를 채택했다. 이제는 단순함을 위해 이전 코드와 함께 작업하고있다.

awk '/o'\''/ { 
     line = "> "; 
     for(i = 20; i <= 33; i++) { 
      line = line " " $i; 
     } 
     print line; 
    }' /var/log/exim/main.log > output.txt 

아이디어가 있으십니까?

EDIT : 전자 메일 주소에 잘못된 문자가 있기 때문에 (그리고 우리 데이터베이스에서는 o라는 접두사가 붙은 이름으로 만 표시되기 때문에) 명확히하기 위해 전자 메일 주소에서 "o"를 grepping하려고합니다.

편집 2 :

[xxx.xxx.xxx.xxx] kathleen.o'[email protected] <kathleen.o'[email protected]> routing defer (-51): retry time not reached 

[xxx.xxx.xxx.xxx] julie.o'[email protected] <julie.o'[email protected]> routing defer (-51): retry time not reached 

[xxx.xxx.xxx.xxx] james.o'[email protected] <james.o'[email protected]> routing defer (-51): retry time not reached 

[xxx.xxx.xxx.xxx] daniel_o'[email protected] <aniel_o'[email protected]> routing defer (-51): retry time not reached 

가 20 필드 전에 모든 것이 표준입니다 내 루프 (20)에서 시작하고 그 이유가 있기 때문에 : 해설 요청에 따라, 여기에 몇 가지 원하는 출력의 소독 샘플입니다 내 목적에 필요하지 않은 정보를 여기서 기록하십시오. 내가 필요한 것은이 솔루션의 IP와 그 이상이다. (각 550 오류에 대한 메시지는 사용중인 각 메일 서버마다 다르다.) 일반적인 메시지 목록을 컴파일 중이다.

+0

원본 로그 파일의 한 줄입니까? –

+0

나는 그것 (민감한 데이터가 거기에서)을 검열해야 할 것이다. 그러나 여기는 하나 다 : 2008-09-28 04:50:43 1KisKj-0000tX-L0 == james.o'[email protected] 라우팅 지연 (-51) : 재시도 시간에 도달하지 않았습니다 – junkforce

+0

당신이 새 라인 화 된 샘플 파일 (몇 줄의 가치)과 원하는 출력을 제공한다면, 당신은 12 개의 무료 펄을 얻을 수 있습니다, 파이썬과 루비 솔루션이 훨씬 더 간단했습니다. –

답변

2

여기에 grep이 실제로 필요하지 않습니다. 당신을 위해 일치하는 라인을 선택 (그리고 ΤΖΩΤΖΙΟΥ에 따라 당신의 연결 버그 수정) AWK 보자 물론

awk '/o'\''/ { 
      line = "> "; 
      for(i = 20; i <= 33; i++) { 
       line = line " " $i; 
      } 
      print line; 
     }' /var/log/exim/main.log > output.txt 

를, 당신이 필요로 결국 몇 가지 이상한 위처럼 promp에서 그것을 할 경우 탈출. 그것은


... 편집 스크립트에서 청소기 : 그것만이 당신이 위의 준 라인 부분이라고 가정 나는 + = 문제를 놓친 첫 번째 패스 ... 또한

에 13ish 필드 (기본적으로 필드는 공백으로 구분됩니다).

+0

나는 이것을 시도하고, output.txt 파일을 삭제 한 후에, 나는 여전히 0의 무리를 얻고있다. – junkforce

+0

맞습니다. 이유에 대한 마지막 질문을 참조하십시오. 그에 따라 코드를 업데이트했습니다. – junkforce

+0

예! 그것은 작동합니다. 코드를 채택한 후 for 루프를 넓히기 만하면됩니다. grep과 다른 것들을 파이핑하는 것보다는 파일에 바로 awk를 사용하는 것이 훨씬 간단합니다. 고맙습니다. – junkforce

3

+ awk. 연결하려는 경우 상수 및/또는 표현식을 공백으로 구분하여 배치하십시오. 이

line += " " + $i 

line = line " " $i 

수정이되어야 그래서

: IFF 수출입 로그 파일 (좀 더 후위에 오전 : 하나의 공백으로 구분의가 아니다 더 간단한 다음 :

grep -F o\' /var/log/exim/main.log | cut -d\ -f20-33 >output.txt 

?

1

" '"은 로컬 부품에서 불법이 아닙니다. RFC2821, 섹션 4.1.2 :

Local-part = Dot-string/Quoted-string 

Dot-string = Atom *("." Atom) 

Atom = 1*atext 

2821 더 참조하므로 비 로컬로 정의 된 요소에 대한 RFC2822 : 즉

atext   =  ALPHA/DIGIT/; Any character except controls, 
         "!"/"#"/ ; SP, and specials. 
         "$"/"%"/ ; Used for atoms 
         "&"/"'"/
         "*"/"+"/
         "-"/"/"/
         "="/"?"/
         "^"/"_"/
         "`"/"{"/
         "|"/"}"/
         "~" 

는 " '는"이메일의 localpart에 가지고 characted 완벽하게 법적 인용 부호로 둘러싸입니다. 자, 귀하의 사이트에서 이 합법적이지 않을 수 있습니다.,하지만 그건 당신이 말한 것이 아닙니다.

주제에 직접적으로 체류하지 않는 미안하지만, 나는 당신의 주장을 수정하고 싶었다.

1

해제 작업, 더 간단하게 : python.

import fileinput 
for line in fileinput.input(): 
    if "'" in line: 
     fields = line.split(' ') 
     print "> ", ' '.join(fields[20:34])