2014-03-06 4 views
0

파이썬에서 회귀 스크립트를 작성하여 우리 도서관이 모든 단위 테스트를 통과했는지 확인합니다. 모든 출력을 .txt 파일에 쓰고 있는데이 파일의 형식은 다음과 같습니다. reg_results_yyyy_mm_dd_hh_mm_ss_rrrrrr_ssssss.txt 여기서 yyyy_mm_dd_hh_mm_ss은 년, 월, 일, 월, 일, 일, 초, 일 rrrrrr은 우리 도서관의 개정 번호입니다. ssssss은 PASSED 또는 FAILED입니다.어떻게 파이썬이나 리눅스에서 특정 단어 다음에 텍스트 파일에서 정보를 추출합니까?

로그 파일에 "Checked out revision 129"가 표시되며, 여기서 129는 변경되는 번호입니다. "개정"다음에 나오는 숫자를 추출해야합니다. 로그 파일의 끝에 "PASSED Unit Tests"또는 "FAILED Unit Tests"라고 표시되고 PASSED/FAILED를 추출해야합니다.

적절하게 로그 파일의 이름을 바꾸려면 로그 파일을 검색하고 개정 번호를 추출하고 로그 파일에서 PASSED/FAILED하는 방법을 알고 싶습니다.

나는 gre30 리눅스 명령을 grep로 들여다 보았지만 구체적인 정보를 얻는 방법을 모르겠다.

당신은 정규식을 사용할 수 있습니다

답변

0

는이 파이썬 태그 이후, 또는 (배쉬)에서 그렙으로 다음 중 하나를

import re 

with open('/tmp/tgt.txt') as f: 
    for line in f: 
     m=re.match(r'Checked out revision (\d+)\s+(\w+)', line) 
     if m: 
      print m.group(1), m.group(2) 

은과 같이 파일을 감안할 때 :

blah 
blew blah 
blah de blah 
Checked out revision 129 PASSED Unit Test 
blah 
blew blah 
Checked out revision 135 FAILED Unit Test 
blah de blah 

인쇄 :

129 PASSED 
135 FAILED 
+0

합니까 (\ D +) 숫자 일치를, \ S +는 공간과 일치 (\ + w) 단어가 일치하는 sed 관용구 또는 두 가지를 인식? 그런 다음, 그룹을 인쇄 할 때, (1)은 (\ d +)에 상관되고 (2)는 (\ w +)에 상관이 있습니까? 코드를 이해하려고합니다. 그래도이게 내가 원하는거야. 감사. – amccormick

+0

예, 정규식과 그룹을 올바르게 해석했습니다. cl 툴로 Perl이나 Python을 쓰고 싶다면 grep이나 Sed와 비슷한 regex를 사용할 수 있습니다. 파이썬에서're.match'는 문자열의 시작 부분에서만 일치한다는 것을주의하십시오; 're.search'를 사용하여 문자열 전체를 검색하십시오. – dawg

0

정규 표현식 사용 :

import re 

rev = None 
pass_or_fail = None 

with open(path_to_your_log_file, 'r') as f: 
    for line in f: 
     if rev is None: 
      found_rev = re.findall(r'Checked out revision (\d+)', line): 
      if found_rev: 
       rev = int(found_rev[0]) 
       continue 
     if pass_or_fail is None: 
      found_pass_fail = re.findall(r'(PASSED|FAILED) Unit Tests', line): 
      if found_pass_fail: 
       pass_or_fail = found_pass_fail[0] 
     if pass_or_fail is not None and rev is not None: 
      break 
0

이것은 sed으로 수행 할 수 있습니다. 모든 것이 (다른 답변에서 제안) 한 줄에 있다면, 그것은 매우 간단합니다 : 당신이 관심있는 두 개의 비트가 서로 다른 라인에있는 경우

, 그것은 조금이라도 더 어렵다
sed -n 's/^Checked out revision \([0-9]\+\) \(FAILED\|PASSED\) Unit Tests$/\1 \2/p' 

하지만 쉽게 충분히 경우

sed -n '/^Checked out revision \([0-9]\+\)/{s//\1/;h}; /^\(FAILED\|PASSED\) Unit Tests$/{s//\1/;H;g;s/\n/ /p}' 

이 조금 설명 곰 :

sed -n '/^Checked out revision \([0-9]\+\)$/{ # Match revision, capture number 
    s//\1/ # Make matched group (number) the only thing in pattern space 
    h   # Save the pattern space (number) to hold space 
} 
/^\(FAILED\|PASSED\) Unit Tests$/{ # Match pass/fail line, capturing pass/fail 
    s//\1/ # Make pass/fail the only thing in pattern space 
    H   # Append pattern space to hold space with newline 
    g   # Fetch hold space to pattern space 
    s/\n// # Replace newline with space 
    p   # Print out pattern space 
}' 
관련 문제