簡體   English   中英

如何在python或linux中某個單詞之后從文本文件中提取信息?

[英]How do I extract information from a text file after a certain word in python or linux?

我正在用python編寫回歸腳本,以驗證我們的庫通過了所有單元測試。 我正在將所有輸出寫入需要以這種格式命名的.txt文件: reg_results_yyyy_mm_dd_hh_mm_ss_rrrrrr_ssssss.txt ,其中yyyy_mm_dd_hh_mm_ss是年,月,日,小時,分鍾和秒修訂, rrrrrr數我們的庫和ssssss的“通過”或“失敗”。

在日志文件中,它將指出“已簽出修訂版129”,其中129是要更改的數字。 我需要提取“修訂”之后的任何數字。 在日志文件的末尾,它將顯示“通過的單元測試”或“失敗的單元測試”,我需要提取通過/失敗的信息。

我想知道如何搜索日志文件並從中提取修訂號和通過/失敗,以便適當地重命名日志文件。

我已經研究了grep linux命令,但是不確定如何僅獲取特定信息。

您可以將正則表達式與grep(來自Bash)一起使用,或者因為標記了此Python,所以可以使用:

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

使用正則表達式:

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

這可以用sed完成。 如果一切都在一行上(如另一答案中所建議),則非常簡單:

sed -n 's/^Checked out revision \([0-9]\+\) \(FAILED\|PASSED\) Unit Tests$/\1 \2/p'

如果您感興趣的兩個位在不同的行上,這會有點困難,但是如果您認識到一個或兩個sed成語,就很容易了:

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
}'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM