sed - 行が条件に一致すると、パターン範囲に一致する行を印刷します。

sed - 行が条件に一致すると、パターン範囲に一致する行を印刷します。

処理する必要がある複数行のログエントリの種類があります。

ログは次のとおりです。

--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てください。

おすすめ記事