2014-01-24 2 views
0

파일 (아래 예제 데이터)에는 한 줄에 특정 텍스트를 검색하는 비슷한 출력 그룹이 있습니다. 각 텍스트 그룹 내에서 issuerIDsubjectID이 모두있는 경우 sourceIPdestIP과 함께이 두 항목을 인쇄하십시오. 그렇지 않은 경우 건너 뛰고 다음으로 건너 뜁니다. 아래 코드는 작동하지만, issuerIDsubjectID이 일치하는 경우에만 원하는 정보를 인쇄하는 논리를 추가하려고합니다.관련 데이터 그룹에서 구문 분석 및 인쇄

다음은 스크립트의 현재 반복입니다.

#!/usr/bin/python 

import re 

sourceIP = 'Source IP:' 
destIP = 'Destination IP:' 
issuerID = 'Issuer ID:' 
subjectID = 'Subject ID:' 
for line in open('data.txt', 'r'): 
    line = line.strip() 
    if line.startswith(sourceIP): 
     sourceIPline = line 
    elif line.startswith(destIP): 
     destIPline = line 
    elif line and line.startswith(issuerID): 
     issuerDomain = re.search("www[\w.com]+", line) 
    elif line and line.startswith(subjectID): 
     subjectDomain = re.search("www[\w.net]+", line) 
     print (sourceIPline) 
     print (destIPline) 
     print issuerDomain.group() 
     print subjectDomain.group() 
     print 

값이 기준을 충족하지 못하는 데이터 세트로 코드를 실행하면 오류가 발생합니다. 나는이 그룹이 무시되고 계속 나아가는 것을 선호 할 것이다.

$ ./dparser.py 
Source IP: 10.0.0.126 
Destination IP: 8.8.8.8 
www.domain.com 
www.domain.net 

Source IP: 10.0.0.126 
Destination IP: 8.8.4.4 
www.domain2.com 
Traceback (most recent call last): 
    File "./dparser.py", line 22, in <module> 
    print subjectDomain.group() 
AttributeError: 'NoneType' object has no attribute 'group' 

다음은 두 그룹으로 구성된 샘플 데이터 세트입니다.

------------------------------- 
Template ID is 45841 
Application Label: 443 
Source IP: 10.0.0.126 
Destination IP: 8.8.8.8 
Source Port: 38946 
Dest Port: 443 
flowStartTime: 2013-12-30 20:20:21 
flowEndTime: 2013-12-30 20:21:37 
flowEndReason: 3 
Protocol: 6 
Octet Total Count: 8497 
Rev Octet count: 28802 
Packet Total Count: 30 
Rev Packet Total Count: 32 
TCP Sequence Number: 561150853 
Initial TCP Flags: S 
Union TCP Flags: APF 
Reverse TCP Sequence Number: 4118697381 
Reverse Initial TCP Flags: AS 
Reverse Union TCP Flags: APF 
SSL Server Cipher: 49171 
-- X.509 Cert 0 (v.2) --- 
     Issuer ID: 3 Val: www.domain.com 
     Subject ID: 3 Val: www.domain.net 
     Valid Not Before: 131015000000Z 
     Not Valid After: 140211235959Z 
     Public Key Length: 0 
--- End of Cert 0 --- 

------------------------------- 
Template ID is 45841 
Application Label: 443 
Source IP: 10.0.0.126 
Destination IP: 8.8.4.4 
Source Port: 42529 
Dest Port: 443 
flowStartTime: 2013-12-30 20:20:22 
flowEndTime: 2013-12-30 20:21:37 
flowEndReason: 3 
Protocol: 6 
Octet Total Count: 8341 
Rev Octet count: 26678 
Packet Total Count: 27 
Rev Packet Total Count: 30 
TCP Sequence Number: 3052048930 
Initial TCP Flags: S 
Union TCP Flags: APF 
Reverse TCP Sequence Number: 101975511 
Reverse Initial TCP Flags: AS 
Reverse Union TCP Flags: APF 
SSL Server Cipher: 49171 
-- X.509 Cert 0 (v.2) --- 
     Issuer ID: 3 Val: www.domain2.com 
     Subject ID: 3 Val: Some Subject 
     Valid Not Before: 130727000000Z 
     Not Valid After: 140118000000Z 
     Public Key Length: 0 
--- End of Cert 0 --- 

답변

1

정규식의 유효성을 검사해야합니다. 이 경우 두 번째 데이터 세트에는 도메인이 없지만 대신 "일부 주제"라고 표시됩니다.

if subjectDomain: 
    print subjectDomain.group() 
else: 
    print line # whatever you want here... 

은 또한 당신의 정규식 어쨌든 제대로 정의되지 않은 :

당신은 뭔가를 원한다. [] 기호는 검사 할 항목을 만듭니다. 당신은 정말로 r'www. \ w + .com '을 원한다. 그렇지 않으면 당신은'wwwww '와'www.w.w '를 허용하고있다.

+0

정규식 팁 주셔서 감사합니다! – Astron

+1

이것을 다시 읽으면, 나는 완전히 명확하지 않다는 것을 깨닫습니다. '[A-Z]'는 A-Z의 모든 문자와 일치한다는 의미입니다. '\ w'는'[A-Za-z0-9]'와 영어 이외의 일부 문자와 거의 같습니다. '[\ w.com]'은'\ w' 또는'.' 또는'c' 또는'o' 또는'm'을 의미합니다. –