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

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

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

標準の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

答え2

そしてpcregrep

$ pcregrep -vM 'useless information(.*\n.*message repeated)*' your-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

-Mpcregrepの複数行モードでは、M正規表現の一致に必要に応じて追加の行をパターンスペース(制限内)にインポートします。有効にすると、perl / PCREフラグが有効になります(トピックの開始/終了ではなく、mトピック内のすべての行の開始/終了で^一致します)。フラグ(また、一致する改行を作成します)$s.いいえこれを有効にすると、.*上記のものが欲にもかかわらず、入力全体を飲み込まない理由が説明されます。

の場合、sed次のようになります。

sed -n '
  :start
  /useless information/ {
    :more
    n
    /message repeated/ b more
    b start
  }
  p'

そしてawk

awk '! (useless && /message repeated/ || \
        (useless = /useless information/))'

(...)busyboxに割り当てるには少なくとも必要です。uselessawk

以下と同じperl

perl -ne 'print unless $useless and /message repeated/ or
            $useless = /useless information/'

and/or代わりに&&/を使用してください。括弧を削除する必要がある||よりも優先順位が低いためです。参考資料を参照してください。)=perldoc perlop

答え3

Raku(以前のPerl_6)の使用

~$ raku -ne '.put unless my $useless and /message \s repeated/ or $useless = /useless \s information/;'  file

#OR

~$ raku -ne '.put unless my $useless and / "message repeated" / or $useless = / "useless information" /;'  file

#OR

~$ raku -ne '.put unless my $useless and m:s/message repeated/ or $useless = m:s/useless information/;'  file 

@Stéphane ChazelasのすばらしいPerlの答えを変えてRakuに翻訳しました。 Rakuは漏洩した内容についてより具体的ですput。これには、1行ずつテキストがロードされたテーマ変数の略語があります.put。 (また改行終了者が追加されました。)$_.put$_put

2番目の違いは、基本的に正規表現マッチングプログラムのスペースは重要ではないということです。したがって、(最初の例では)message \s repeated入力が一致し、二重引用符で囲まれた文字列も一致します"message repeated"

ただし、引用符message repeatedがない場合や引用符がない場合は、すべてuseless information多数のエラーと一致しません。

Space is not significant here; please use quotes or :s (:sigspace) modifier (or, to suppress this warning, omit the space, or otherwise change the spacing)

これが上記の2番目と3番目のコード例の起源です。

https://docs.raku.org/言語/regexes#Sigspace
https://docs.raku.org/routine/put
https://raku.org

関連情報