grepの正規表現

grepの正規表現

ここに次のコマンドがあります。

grep -B10 -A10 '14:14:50 {"channels":["/alerts/6979/new"],"data":"New alerts for unit 6979"}' mygateway.log

14:14:50を検索する代わりに、50をランダムな数字に置き換えたいと思います。だから私は「.」を使って正規表現のすべての文字を表現したいと思います。ただし、プログラミング言語では通常、正規表現を \abc.xyz\ として参照します。ここで「。」任意の文字と任意の数の文字にすることができます。しかし、上記のgrep文字列で "."を使用すると、戻り値は提供されません。

答え1

ここでの問題は、この単語が.何らかの意味で使用されることです。一つ特徴。したがって、inは一致します.が、一致するものがないため、残りの行は一致しません。何があっても、あなたが探しているものが何であるかを知っているので5500数字、正規表現をより具体的に記述する必要があります。数字を次のように見てみましょう。

[0-9]\+

数値にオプションの小数部(小数点の後ろ)がある可能性があることがわかっている場合は、次のように使用できます。

[0-9]\+\(\.[0-9]\+\)?

's(PCRE)オプションを使用する場合は、+角括弧の前のバックスラッシュを省略する必要があります。grep-P

このオプションを使用する予定の場合は、-PPOSIXと互換性がなく、すべてのプラットフォームで機能しない可能性があることに注意してください。

答え2

-Pこのフラグを使用してPerl準拠の正規表現を有効にし、以下を使用することもできます\d

grep -P -B10 -A10 '14:14:\d+ {"channels":["/alerts/6979/new"],"data":"New alerts for unit 6979"}' mygateway.log

制限を減らして実際に単純化することもできます(詳細はもちろん、入力データによって異なりますが、これは機能するはずです)。

grep -P -B10 -A10 '14:14:\d+.*channels.*alerts/6979/new.*data.*New' mygateway.log

/alerts/6979/new/行が両方とも一致した場合、New残りは変更されていないと見なされます。

関連情報