是否可以查找' 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
答案 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; ;
如果您需要问题中所述的输出,则需要多行,以便雄辩地执行此操作并可能需要使用其他命令,例如sed
,awk
或 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/')