2016-01-22 70 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脚本中插入这一行。 –

相关问题