如何使用grep匹配字符串然后查找其他字符串

时间:2016-01-22 04:53:52

标签: regex perl shell grep

是否可以查找' string1'如果它是真的那么寻找' string2'用grep。 这是我的情况。我有很多txt报告文件,我需要搜索' FAIL'基于测试路径'测试路径:路径/到/测试' 样本报告文件:

     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行而不打印测试路径,我也想删除&#39 ;;'在线。

 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

2 个答案:

答案 0 :(得分:1)

简单的用Awk。

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

如果你的shell太旧而无法支持**通配符,或者你真的在这个通配符上有不是普通文件的匹配项,那么你可能希望保留find命令,并将其传递给AWK。

这将在FAIL之后保留分号。如果这是一个问题,在打印之前很容易摆脱; sub(";", "", $3):

第一行的正则表达式只是寻找"测试路径:" - 如果你想寻找特定的路径,你需要逃避反斜杠。

答案 1 :(得分: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;     ;

如果您需要问题中所述的输出,则需要多行,以便雄辩地执行此操作并可能需要使用其他命令,例如sedawk perl 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/')