2016-10-10 4 views
0

状況は次にあります。ログファイルには次のようなマイナス文字で区切られたログファイルがあります。Bash:パターン間にパターン2がある場合のみパターン間の線を得る方法

Timestamp1 
--- 
Log: 1 
Address: http://addr1.com 
Payload: <soap:Envelope> 
      <soap:Body> 
       <context 1-1> 
       <context 1-2> 
       <context 1-3> 
      </soap:Body> 
     <soap:Envelope> 
---; 
Timestamp2 
--- 
Log: 2 
Address: http://addr2.com 
Payload: <soap:Envelope> 
      <soap:Body> 
       <context 2-1> 
      </soap:Body> 
     <soap:Envelope> 
---; 
Timestamp3 
--- 
Log: 3 
Address: http://addr3.com 
Payload: <soap:Envelope> 
      <soap:Body> 
       <context 3-1> 
       <context 3-2> 
      </soap:Body> 
     <soap:Envelope> 
---; 
... 

いくつかのキーワードが見つかりました。キーワードは「文脈2-1」である場合は、次の文字列が印刷されなければならない:

--- 
Log: 2 
Address: http://addr2.com 
Payload: <soap:Envelope> 
      <soap:Body> 
       <context 2-1> 
      </soap:Body> 
     <soap:Envelope> 
---; 

だから私はその周りに区切り文字の「貪欲」カットと、このパターンの検索を行うことができますか?

+0

'...'を削除してより良いサンプルを表示し、あなたの試行を表示してください。 – anubhava

答えて

1

sed -n '/^---/ {:a;N;/---;/!ba;/context 2-1/p}' file 

説明:--- で始まる行は

  • aを発見された

    • /^---/:ループ
    • Nに来てのラベル:次の追加〜への行パターンスペース
    • /---;/!:見つからない場合---;ながら...
    • baループ
    • /context 2-1/pラベルaには:ループが終了したときにcontext 2-1が発見された場合、プリントすべての行は、以前のパターンスペースに追加
  • 0

    ガイドラインとしてこれを使用する:How to select lines between two patterns?

    $0=="---" {     # at the fron marker 
        flag=1     # flag up 
        buf=""     # clear the buf 
    } 
    $0=="---;" { flag=0 }   # at the end marker, flag down 
    { 
        buf=buf $0 (flag?RS:"") # gather buffer, add RS before the end marker 
        if($0 ~ "^Payload2")  # if keyword found 
         output=1    # output flag up 
    } 
    flag==0 && output==1 {  # after end marker when putput flag up 
        print buf     # output buf 
        output=0     # output flag down 
    } 
    

    を実行し、それは:

    $ awk -f script.awk logfile 
    --- 
    Log2 
    Address2 ... 
    Payload2 ... 
    ---; 
    
    +0

    ありがとうございました。はい、私はsedを使用してパターン間のテキストをカットする方法を知っていますが、私は2番目のパターンの別の存在を確認する方法を知らなかった。 –

    0
    awk -vRS="Timestamp[0-9]+" -v k="context 2-1" '$0~k' file2 
    

    をこれは、改行文字としてTimestamp[0-9]+使用しています。 kはあなたが望むキーワードです。 $0がキーワードと一致する場合は、$0と印刷します。 SEDで

    関連する問題