2016-01-22 137 views
0

是否有可能查找'string1'如果其爲true,則使用grep查找'string2'。 這是我的情況。我有很多TXT報告文件,我需要尋找「失敗」基於測試路徑「測試路徑:路徑/到/測試」 樣本報告文件:如何使用grep匹配字符串,然後查找其他字符串

 Test path:   path/to_tests/t1 
    Host name:     testpc1 
        AMEND_1/Sec3/E30012.c,   ;    PASS;  ;    ;    ;   ; 
        AMEND_1/Sec3/E30013.c,   ;    FAIL;  ;    ;    ;   ; 
        AMEND_1/Sec3/E30014.c,   ;    PASS;  ;    ;    ;   ; 
        AMEND_1/Sec3/E30015.c,   ;    FAIL;  ;    ;    ;   ; 

我想下面的命令,但它只打印FAIL行但不測試路徑,我也想刪除';'在行中。

find . -name "*concat.txt" | xargs grep -E 'Test path: path/to_tests/t1' grep -e 'FAIL' 

請指導我如何使用一行命令實現此目的。

願望輸出:

Test path:   path/to_tests/t1 AMEND_1/Sec3/E30013.c FAIL 
Test path:   path/to_tests/t1 AMEND_1/Sec3/E30015.c FAIL 
+1

請添加您的願望輸出。 – serenesat

+1

在單行命令中?爲什麼這很重要?它有多重要? –

+0

我們有處理報告比較和excel生成的大外殼腳本..所以想在開始比較之前添加一行命令。所以希望將故障重定向到文件併發送給團隊,這對團隊成員僅查看失敗的測試很有幫助。 –

回答

0

使用此:

find . -name "*concat.txt" | (read file && egrep 'Test path:[ \t]*path/to_tests/t1' $file && grep 'FAIL' $file) 

我不知道該行Test path; (...)的空白,所以我增加了模式[ \t]*匹配您可能遇到的任何空白那裏。

這將打印:

Test path: (whitespace) path/to_tests/t1 
AMEND_1/Sec3/E30013.c,   ;    FAIL;  ; 
AMEND_1/Sec3/E30015.c,   ;    FAIL;  ; 

如果您需要的輸出作爲你的問題說,你需要一個以上的線,這樣做雄辯地,可能需要使用其他命令,如sedawkperl regexps

帶有一些sed的版本可以更好地格式化輸出。

find . -name "*concat.txt" | (read file && egrep 'Test path:[ \t]*path/to_tests/t1' $file | sed 's/^[ \t]*//' && grep 'FAIL' $file | sed 's/^[ \t]*//' | sed 's/[ \t]*;[ \t]*//' | sed 's/,\(FAIL\).*/ \1/') 
+0

它不是像上面顯示的那樣打印,只打印「測試路徑:(空白)路徑/ to_tests/t1」,並且光標不會從執行模式退出。 –

+0

查看我編輯的版本 – hgiesel

+1

需要將'sed'管道到'sed'的情況非常罕見。你會想重構一個'sed'腳本,也可能考慮到'grep'。見http://www.iki.fi/era/unix/award.html#grep – tripleee

1

簡單與Awk。

awk '/Test path:/ { t=$0; next } 
    $3 == "FAIL;" (print t, $2, $3 }' **/*concat.txt 

如果你的shell是太老,支持通配符**,或者你真的有這個通配符不屬於純文本文件的比賽,你可能要保持你的find命令,管,要在awk。

這將在FAIL之後保留分號。如果這是一個問題,打印前很容易擺脫; sub(";", "", $3):

第一行的正則表達式只是尋找「測試路徑:」 - 如果你想尋找一個特定的路徑,你需要避開反斜槓。

+0

謝謝三合一,它完美的作品。我會嘗試在shell腳本中插入這一行。 –