2014-04-11 6 views
0

다음과 같은 문제가 있습니다. 로그 파일을 줄 단위로 읽고 싶지만 줄을 줄이려면 두 개의 타임 스탬프 사이에있는 줄을 필터링하고 싶습니다! AWK에파이썬에서 두 타임 스탬프 사이의 줄을 필터링하는 방법

예 :

find all between two patterns: pattern1 = 2012-10-23 14, pattern2 = 2012-10-23 16 
awk '/2012-10-23 14/{P=1;next}/2012-10-23 16/{exit} P' server.log 

또는 egrep을 하나 개의 패턴이

:

egrep "2012-10-23 (1[4-6]:[0-5][0-9])" server.log 

상기 AWK 라인 내게 이러한 두 타임 스탬프들 사이에서만 라인을 줄 것이다.

어떻게 내가 모든 시스템 명령이나 AWK, GREP을 ... 실행하지 않고 파이썬에서 할 수 있지만, 단지 파이썬 정규식 ADV에서

감사합니다. 당신의 AWK 코드에서 하나 번역

답변

0

하나

with open('yourFile') as f: 
    lines = f.read().splitlines() 

for l in lines: 
    if l.startswith('2012-10-23 14'): 
     p=1 
    elif l.startswith('2012-10-23 16'): 
     p=0 
     break 
    if p: print l 

이 1 라인이 일치 2012-10-23 14 ...로 시작하는 때 출력을 시작하고 1 라인이 일치 2012-10-23 16..로 시작하는 경우 printting 중지됩니다. (awk 코드와 동일)

0

@Kent 게시물은 타임 스탬프가 라인 시작 부분에 있다고 가정 할 때만 작동한다고 생각합니다. AWK/egrep 코드를 사용하면 더 일반적인 것을 요청할 수 있습니다.

다음 코드는 작동합니다 : 라인 내에서 검색 패턴이 위치 독립적으로

  • 독립적에 (이 ;-) 매우 상정 비록) 로그의 라인이 제대로 분류되어있는 경우
  • 을 비 블로킹 생성기로 사용하여 불필요한 메모리 할당없이 처리되는 결과를 얻을 수 있습니다.
  • 은 더 많은 수정을 원한다면 더 일반적인 코드 구조를 가지고 있습니다. 파이썬과

    import re 
    
    def log_lines(yourFile, regexp): 
        rxp = re.compile(regexp) 
        with open(yourFile) as f: 
        for line in f.readlines(): 
         if rxp.search(line): 
         yield line 
    
    for line in log_lines("yourFile", "2012-10-23 1[4-6]"): 
        print line 
    

스테이,이는`regexp` 일치하는 경우에만 라인을 나열하지만, ​​"경계"사이의 선 아무것도 할 수 ;-)

+0

adictive이며, 그들은 인쇄 할 필요가 아웃. jboss/weblogic의 로그 파일과 마찬가지로, stacktrace 출력에는 타임 스탬프가 포함되지 않지만 "경계선"사이에 위치합니다. 그의 awk 한 - 라이너 그것을 않습니다. 그의 awk도 텍스트의 첫 번째 트렁크만을 인쇄하고 나간다. – Kent

+0

둘 다 맞습니다. 저는 켄트가 언급 한 것처럼 타임 스탬프가 없더라도 두 줄의 타임 스탬프 사이에 모든 줄을 인쇄하는 것이 중요하다는 것을 제 질문에서 언급하는 것을 잊어 버렸습니다. 마틴은 또한 로그 파일이 여러 번 제대로 정렬되지 않는다는 점을 지적했습니다. 타임 스탬프는 항상 라인 시작 부분에 있습니다. 나는 mem를 줄이기 위해서 당신의 제안을 결합 할 것입니다. alloc. 다시 한 번 감사드립니다! – FotisK

관련 문제