2016-11-24 10 views
1

特定の種類のログに属する部分が必要なログファイルがあります。それは複数の行である可能性があります。
は、私がここで直接ログファイルを投稿することはできませんが、それは形式以下である:
2つの同じパターンの間でファイルからコンテンツを抽出します

<date-format> Thread-MESSAGE1 random-message 
line 1 
line 2 
line 3 
line 4 
<date-format> Thread-MESSAGE1 random-message2 
line 5 
<date-format> Thread-MESSAGE2 random-message3 
line 6 
line 7 
line 8 
line 9 
<date-format> Thread-MESSAGE3 random-message4 
<date-format> Thread-MESSAGE1 random-message5 
<date-format> Thread-MESSAGE1 random-message6 
line 10 
line 11 
<date-format> Thread-MESSAGE7 random-message7 
<date-format> Thread-MESSAGE8 random-message9 
<date-format> Thread-MESSAGE9 random-message10 
<date-format> Thread-MESSAGE1 random-message11 

Iが出力する必要があります。私のようにsedを使用したが「スレッドMESSAGE1」を使用してみました

<date-format> Thread-MESSAGE1 random-message 
line 1 
line 2 
line 3 
line 4 
<date-format> Thread-MESSAGE1 random-message2 
line 5 
<date-format> Thread-MESSAGE1 random-message5 
<date-format> Thread-MESSAGE1 random-message6 
line 10 
line 11 
<date-format> Thread-MESSAGE1 random-message11 

'MESSAGE1'キーで2つの連続したログがある場合は、開始パターンと終了パターンの両方が機能しませんでした。
Perlを使って先にネガティブルックアップを使うことを考えましたが残念ながらPerlを使うことはできませんし、 'sed'も 'awk'もパターンのネガティブルックアップをサポートしていません。

tac source_file.log | sed -n '{/<date-format> Thread-/!H; /<date-format> Thread-/{H;d;x} /<date-format> Thread-MESSAGE1/p; d;}' > test.log 

アイデアはその後test.logの出力を反転することでしたが、スレッド」の後に中括弧を追加する -/{H; dは、X:
は最近、私は、以下の「sedの」パターンをしようとしていました} 'コマンドの後に余分な文字が表示されています。' もっと良い選択肢はありますか?または、sedの中括弧を使用してコマンドをグループ化する方法はありますか?

答えて

2

あなたは、このawkコマンドを使用することができます。

awk -v kw='Thread-MESSAGE1' '$2 ~ /^Thread-/ {p = ($2 == kw)} p' file 

<date-format> Thread-MESSAGE1 random-message 
line 1 
line 2 
line 3 
line 4 
<date-format> Thread-MESSAGE1 random-message2 
line 5 
<date-format> Thread-MESSAGE1 random-message5 
<date-format> Thread-MESSAGE1 random-message6 
line 10 
line 11 
<date-format> Thread-MESSAGE1 random-message11 

これはワークアウトをしない場合、私はあなたがより現実的なサンプルデータをポスト示唆しています。

+0

ありがとうございます。私は、このコマンドが与えられたファイルに対して動作することを確認しました。しかし、私はちょうど1つの質問があります、今すぐkw = 'スレッド - メッセージ1'は定数文字列です。正規表現を持つことはできますか? – akash12300

+1

正規表現を渡す場合は、awkコマンドの中で '$ 2 == kw'の代わりに' $ 2〜kw'を使います – anubhava

関連する問題