2017-09-20 8 views
1

私はこの問題を解決するためにc-shell(私は他のオプションは利用できないと思います)とSEDを使用しようとしています。失敗したすべてのいくつかのテストの報告書で、この例のファイルを考える:2パターン一致後のSED抽出最初の出現

============ 
test_085 
============ 
- Signature code: F2B0C 
- Failure reason: timeout 
- Error: test has timed out 

============ 
test_102 
============ 
- Signature code: B4B4A 
- Failure reason: syntax 
- Error: Syntax error on file example.c at line 245 

============ 
test_435 
============ 
- Signature code: 000FC0 
- Failure reason: timeout 
- Error: test has timed out 

私が実行しているすべてのテストをループするスクリプトを持っていると私は失敗したかどうかを確認するために、このレポートに対してそれらをチェックして、後で統計を行う:

if (`grep -c $test_name $test_report` > 0) then 
    printf ",TEST FAILED" >>! $report 
else 
    printf ",TEST PASSED" >>! $report 
endif 

私がしたいのは、$ test_reportに$ test_nameが見つかった場合に理由を抽出することです。たとえば、test_085の場合は 'timeout'のみを抽出し、test_102は '構文'のみを抽出し、test_435 'timeout'の場合はtest_045を抽出します(このレポートには存在しないため意味がありません)。 test_085、失敗の理由を:

答えて

1

awk -v t_name="test_102" '$1==t_name{ f=1 }f && /Failure reason/{ print $4; exit }' reportfile 
  • $1==t_name{ f=1 } - パターンにマッチする行に遭遇した上で(すなわちテスト名t_name) - フラグfをアクティブ状態に設定する

  • f && /Failure reason/からFailure reasonの行をキャプチャし、第4フィールド

  • exitにある理由を印刷する - - 終了スクリプト考えテスト名部(fが「アクティブ」である間)下の行を反復しながら

    :すぐ


出力を冗長な処理を回避するために実行3210

syntax 
+0

ありがとうございます!私は実際にテスト名が印刷される必要はありません。失敗の理由だけで、私はプリント名を取り出しました。コマンドを少し細かくすることは可能ですか? – Birbal

+0

@Birbal、よろしくお願いします。私の説明を参照してください – RomanPerekhrest

+0

もう一度ありがとう!すべて意味をなさない。 – Birbal

0

あなたは構文解析を容易にするためにawkRSFS変数を扱う試すことができます。

$ awk -v RS='' -F='==*' '{gsub(/\n/," ") 
    sub(/.*Failure reason:/,"",$3) 
    sub(/- Error:.*/,"",$3) 
    printf "%s : %s\n",$2,$3}' file 

出力:

を本質的に私は、これら二つのパターンが一致した後の最初の発生を抽出したいです
test_085 : timeout 
test_102 : syntax 
test_435 : timeout 

改行を気にしない場合は、gsub()機能を削除できます。短いAWKアプローチ - 指定されたテスト名のために、 "失敗理由" を抽出するために

0

属性に名前と値のマッピングがある入力がある場合は、まず下のマッピング(n2v[])をキャプチャする配列を作成し、その名前で値にアクセスします。例:

$ cat tst.awk 
BEGIN { RS=""; FS="\n" } 
$2 == id { 
    for (i=4; i<=NF; i++) { 
     name = value = $i 
     gsub(/^- |:.*$/,"",name) 
     gsub(/^[^:]+: /,"",value) 
     n2v[name] = value 
    } 
    print n2v[attr] 
} 

$ awk -v id='test_085' -v attr='Failure reason' -f tst.awk file 
timeout 

$ awk -v id='test_085' -v attr='Error' -f tst.awk file 
test has timed out 

$ awk -v id='test_102' -v attr='Signature code' -f tst.awk file 
B4B4A 

$ awk -v id='test_102' -v attr='Error' -f tst.awk file 
Syntax error on file example.c at line 245 

$ awk -v id='test_102' -v attr='Failure reason' -f tst.awk file 
syntax 
関連する問題