処理する必要がある複数行のログエントリの種類があります。
ログは次のとおりです。
--START--
Device=B
Data=asdfasdf
Lorem=Ipsum
--END--
--START--
Device=A
Data=asdfasdf
Lorem=Ipsum
--END--
--START--
Device=B
Data=asdfasdf
--END--
--START--
Device=A
Data=asdfasdf
--END--
--START--
Device=B
Data=asdfasdf
--END--
--START--
Device=C
Data=asdfasdf
Lorem=Ipsum
--END--
特定のパターンが一致する場合は、--START--
間のすべての内容を印刷したいと思います。--END--
たとえば、
すべてのアイテムを印刷Device=A
--START--
Device=A
Data=asdfasdf
Lorem=Ipsum
--END--
--START--
Device=A
Data=asdfasdf
--END--
これまで私ができることは、次のように書くだけです。
sed -e -n '/--START--/,/--END--/p' < input
{}
入力値を効果的に出力しますが、フィルタを追加しN
てから条件が一致したら出力する必要があるようです。
私も完全に迷子になったような気がする。
1行が条件に一致する場合は、複数行を印刷する方法を知っていますか?
ベストアンサー1
$ sed -n '/--START--/{:a;N;/--END--/!ba; /Device=A/p}' file
--START--
Device=A
Data=asdfasdf
Lorem=Ipsum
--END--
--START--
Device=A
Data=asdfasdf
--END--
(上記はGNU sedでテストされています。BSD / OSXで実行するように調整する必要があります。)
仕組み:
/--START--/{...}
含まれている行に達するたびに、中
--START--
括弧内のコマンドが実行されます{...}
。:a
ラベルを定義します
a
。N
次の行を読み、パターンスペースに追加してください。
/--END--/!ba
パターンスペースに現在のラベルが含まれていない場合は、
--END--
ラベルに戻りますa
。/Device=A/p
ここまで来るとパターン空間がで始まり
--START--
で終わるという意味です--END--
。さらに、パターンスペースにそれが含まれている場合はDevice=A
、それを印刷しp
てください。