パターンに一致する行と、他のパターンに一致する後ろのすべての行を削除します。

パターンに一致する行と、他のパターンに一致する後ろのすべての行を削除します。

以前、誰かがこの質問をしたかどうかわからないということから始めましょう。私は答えを見つけるためにインターネット検索をしましたが、見つかりませんでした。

標準のLinux / Unixコマンド(FreeBSDで実行)を使用して、ログファイルからパターンに一致する行を除外したいと思います。ログファイルには、ログエントリを圧縮するための「最後のメッセージが複数回繰り返される」も含まれています。

たとえば、私は次のようなことを言いたいと思います。

May 27 2023 11:07 relevant information #1
May 27 2023 11:07 relevant information #2
May 27 2023 11:08 last message repeated 3 times
May 27 2023 11:08 useless information #1
May 27 2023 11:08 last message repeated 5 times
May 27 2023 11:09 last message repeated 8 times
May 27 2023 11:09 relevant information #3
May 27 2023 11:09 useless information #2
May 27 2023 11:10 useless information #3
May 27 2023 11:10 last message repeated 6 times

次の出力を取得します。

May 27 2023 11:07 relevant information #1
May 27 2023 11:07 relevant information #2
May 27 2023 11:08 last message repeated 3 times
May 27 2023 11:09 relevant information #3

これを行うにはsedコマンドを使用しましたが、それを見つけるのにどのように機能するのかわかりません。私は特に、複数の「最後のメッセージの繰り返し」が続くログ行を失いました。私が現在作業している作業は次のとおりです。

sed '/useless information/{d;N;/last message repeated/d;}' ./logfile.txt

上記の方法では、最初に「役に立たない情報」を含む一致する行を削除してから、名前空間に次の行を追加しますN。その後、結果行に「最後のメッセージの重複」が含まれている場合は削除する必要があります。ただし、「役に立たない情報」を含む行のみを削除します。

ベストアンサー1

役に立たない情報の代わりに関連情報をテストできる場合は、すべてのUnixシステムのすべてのシェルでawkを使用してください。

awk '/last message repeated/ && f; {f=/relevant information/} f' file
May 27 2023 11:07 relevant information #1
May 27 2023 11:07 relevant information #2
May 27 2023 11:08 last message repeated 3 times
May 27 2023 11:09 relevant information #3

おすすめ記事