web-dev-qa-db-ja.com

"grep:Unmatched [" regex使用時のエラー

私はこれに似たパターンを見つけようとしています:

tail -n 100000 gateway.log | grep -B10 -A10 'Nov 22 11:13:56 Received Packet from [10.50.98.68'

「11:13:56」はいつでもかまいません。

これは私が思いついたものです:

tail -n 100000 gateway.log | grep -B10 -A10 'Nov 22 [0-9]:[0-9]:[0-9] Received Packet from [10.50.98.68'

「unmatched [」と表示されている場合、それが何を指しているのかわかりません。この部分「[0-9]:[0-9]:[0-9]」は正規表現と見なされます。この部分「[10.50.98.68」は文字列であるはずです。

5
JohnMerlino

Grep正規表現では、[特殊文字 です。リテラル[の場合は、\[のようにバックスラッシュでエスケープする必要があります。

Nov 22 [0-9]: ... [10.50.98.68の全体が正規表現であることに注意してください。それを指して「この部分は正規表現です。この部分はリテラル文字列である必要があります」と言って、grepがあなたの考えを読むことができると期待することはできません。そのため、照合するリテラル文字列の一部である特殊文字をエスケープする必要があります。


無関係ですが、正規表現で[0-9]が出現するたびに、1文字とのみ一致します。また、.もエスケープする必要がある特殊文字です。正規表現には、おそらく次のようなものが必要です。

^Nov 22 [0-9][0-9]:[0-9][0-9]:[0-9][0-9] Received Packet from \[10\.50\.98\.68
7
jw013

行の最後の括弧の前にバックスラッシュを置きます(これは一致しません)[は、クラスの正規表現の特殊文字です。

あなたが望んでいるのは:

 tail -n 100000 gateway.log | grep -B10 -A10 'Nov 22 [0-9]:[0-9]:[0-9] Received Packet from \[10.50.98.68'

また、他の答えが言うように、あなたはあなたの正規表現で他の問題を抱えています、例えばあなたがリテラルになりたい期間、そしてあなたは一日のいくつかの時間に失敗する各コロンの間に一つの数字しか許さないという事実です。欲しい時間[0-9]\{1,2\}:[0-9]\{1,2\}:[0-9]\{1,2\}およびIPアドレスの場合、有効なIPアドレスとオンフライで一致する正規表現が必要な場合は、思ったよりも複雑です。 IPが変わるかどうかは言わなかった。

4
Gregg Leventhal