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

したがって、私のアプローチは、「テストの実行: 0、失敗: 0、エラー: 0、スキップ: 0、経過時間」というパターンを grep することでしたが、grep パターンに属するテストを見つけるためのスマートな方法が必要になります。ここに良い/エレガントなソリューションはありますか? ありがとう!

4

3 に答える 3

2

私はおそらく と の組み合わせでそれを行うでしょgrepawk

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]"

(ゼロ以外の数のテストを実行したプロセスのみを除外するために、2 番目の pcgrep コマンドで-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)次に、「実行中」を含む行だけをgrepします:

指図:

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 を使用して、私が見たいと思っている変数のみを出力します(あなたの例では、常に行の3番目の「単語」であるように見えるプロセス名):

最終コマンド:

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 に答える