0

我有一个包含此类输出的日志文件:

  [mvn] Running com.mypackage.MyTest
   ...
  [mvn] Tests run: 12, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 104.648 sec
  [mvn] Running com.mypackage.MyNotExecutedTest
   ...
  [mvn] Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.525 sec
  [mvn] Running com.mypackage.AnotherNotExecutedTest
   ...
  [mvn] Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.569 sec
  [mvn] Running com.mypackage.FailedTest
   ...
  [mvn] Tests run: 5, Failures: 2, Errors: 0, Skipped: 0, Time elapsed: 22.357 sec
   ...

而在“...”所在的位置可以有任意数量的行(例如堆栈跟踪,一些调试输出)。我想要实现的是尚未执行的测试列表:

  com.mypackage.MyNotExecutedTest
  com.mypackage.AnotherNotExecutedTest

所以我的方法是 grep 模式“测试运行:0,失败:0,错误:0,跳过:0,经过时间”但是我需要一种聪明的方法来找出测试属于 grep 模式。这里有什么好的/优雅的解决方案吗?谢谢!

4

3 回答 3

4

编写一个awk存储最新行的脚本 Running,然后打印存储的行,如果它看到Tests run: 0

awk '/\[mvn\] Running /{ t=$3 }
  /\[mvn\] Tests run: 0/ { print t }'  logfile

编辑:我取出了行开头的锚点,以便正确处理缩进输入。

于 2012-09-06T14:41:06.487 回答
2

我可能会结合使用grepand来做到这一点awk

grep -A1 "Tests run: 0" | awk '/Running {print $NF}'
于 2012-09-06T15:51:41.403 回答
1

我会用几个 grep 命令和一个 awk 来做到这一点,所有这些都通过管道连接在一起。我将引导您了解我的逻辑:

1) 使用pcregrep而不是 grep 来匹配以 "Running" 开头并以 "Tests run: 0" 结尾的多行模式,如下所示:

命令:

pcregrep -M "Running(\n|.)*?Tests run: 0" file.txt

(注意使用-M参数来允许多行匹配和?星号之后使其不贪婪)

输出:

[mvn] Running com.mypackage.MyTest
...
[mvn] Tests run: 12, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 104.648 sec
[mvn] Running com.mypackage.MyNotExecutedTest
...
[mvn] Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.525 sec
[mvn] Running com.mypackage.AnotherNotExecutedTest
...
[mvn] Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.569 sec

2)如您所见,不幸的是,这也匹配了一些不需要的项目,所以我会再次使用 pcregrep 删除有问题的条目,如下所示:

命令:

pcregrep -M "Running(\n|.)*?Tests run: 0" file.txt | \
pcregrep -Mv "Running(\n|.)*?Tests run: [^0]"

(注意在第二个 pcregrep 命令中使用-v参数和[^0]字符类来仅消除运行非零测试次数的进程)

输出:

[mvn] Running com.mypackage.MyNotExecutedTest
...
[mvn] Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.525 sec
[mvn] Running com.mypackage.AnotherNotExecutedTest
...
[mvn] Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.569 sec

3)然后我会找出包含“正在运行”的行:

命令:

pcregrep -M "Running(\n|.)*?Tests run: 0" file.txt | \
pcregrep -Mv "Running(\n|.)*?Tests run: [^0]" | \
grep -i running

输出:

[mvn] Running com.mypackage.MyNotExecutedTest
[mvn] Running com.mypackage.AnotherNotExecutedTest

4)最后使用 awk 仅打印我有兴趣看到的变量(进程名称,在您的示例中,它似乎总是行中的第三个“单词”):

最终命令:

pcregrep -M "Running(\n|.)*?Tests run: 0" file.txt | \
pcregrep -Mv "Running(\n|.)*?Tests run: [^0]" | \
grep -i running | \
awk '{print $3};'

最终输出:

com.mypackage.MyNotExecutedTest
com.mypackage.AnotherNotExecutedTest

嗯!

于 2012-09-07T21:24:46.717 回答