2017-12-14 26 views
1

第二出現のBASH2つのパターン間grepする方法 - 私は、二つのパターンの間にマッチ第二のパターンまで、第1のパターンと一致倍 <p></p>私は次のファイルを持っているから をファイルのセクションを抽出する必要

FileSet { 
    Name = "FileseT-XXXXX" 
    Include { 
    Options { 
     signature = MD5 
    } 
     File = /etc 
     File = /usr/sbin 
     File = /root 
     File = /srv/ 
} 
} 

#SECOND FILESET 
FileSet { 
    Name = "FileseT-XXXXX2" 
    Include { 
    Options { 
     signature = MD5 
    } 
     File = /srv/ 
} 

}

「Name = "FileseT-XXXXX"」を2番目の「}」に基づいてgrepして、セクション内のファイルを取得します。

私は最初の4つの "ファイル" を取得したい

File = /etc 
    File = /usr/sbin 
    File = /root 
    File = /srv/ 

事前に感謝します。

答えて

0

まず、データを"FileseT-XXXXX"FileSetの間で一致させることでデータセットを絞り込みます。次に、私は希望のFile部分を抽出します。

これはファイルだけを抽出するためにトリックを行う必要があります。

pattern='XXXXX' 

awk -v n="\"FileseT-$pattern\"" '$0 ~ n {flag=1; next} /FileSet/{flag=0} flag' your_data_file | awk '/File =/{print $0}' 

あなたはシェル変数にあなたのパターンを保存することができます。 -vフラグを使ってawkでシェル変数を使うことができることに注意してください。この方法で、スクリプト内の目的のパターンを簡単に変更できます。次にawkのパターンマッチングを使用して、"FileseT-XXXXX"と最初の出現をFileSetの間で出力から除外することができます。その後、結果を別のawkコールに配管する(|)コールでは、目的の回線だけを抽出します。

EDIT:あなたはあなただけのプリントに記述するように複雑な取得する必要はありません

awk -v n="\"FileseT-$n\"" '$0 ~ n {flag=1; next} /}/ && ++c == 2 {flag=0} flag' your_data_file 
+0

それはうまく動作します.1つの質問は、 "FileseT-XXXXX"と2番目の '}'の間の行を抽出することは可能ですか?ありがとう:D –

+0

はい、更新をチェックし、 '&& ++ c == 2'部分に注意してください。 – marcell

2

"FileseT-XXXXX"}の第二の発生との間の線を抽出するにはターゲットブロック内のFile =行。必要なのは、

$ awk '/Name = /{f=/"FileseT-XXXXX"/} f && /File =/' file 
     File = /etc 
     File = /usr/sbin 
     File = /root 
     File = /srv/ 

これがすべてではない場合は、より正確に代表的なサンプル入力/出力を提供するために質問を編集してください。

+1

@EdMortonの発言をありがとう。あなたのソリューションはより簡潔で簡単です。 – marcell

+0

ようこそ。次の作業については、https://stackoverflow.com/help/someone-answersを参照してください。 –

関連する問題