web-dev-qa-db-ja.com

正規表現でgrepを使用して一致を除外する

正規表現の-eとともに、反転一致の-vでgrepを使用しようとしています。構文を正しく取得できません。

私は次のようなことをしようとしています

tail -f logFile | grep -ve "string one|string two"

このようにすると、フィルターは適用されません。

tail -f logFile | grep -ev "string one|string two"

私は得る

grep: string one|string two: No such file or directory

()または引用符を使用してみましたが、機能するものを見つけることができませんでした。

これどうやってするの?

40
Hortitude

問題は、デフォルトでは、適切な代替を得るために|をエスケープする必要があることです。つまり、grepは「foo | bar」をリテラル文字列「foo | bar」のみに一致すると解釈しますが、パターン「foo\| bar」(エスケープされた|を含む)は「foo」または「bar」に一致します。

この動作を変更するには、-Eフラグを使用します。

tail -f logFile | grep -vE 'string one|string two'

または、grep -Eと同等のegrepを使用します。

tail -f logFile | egrep -v 'string one|string two'

また、パターンがリテラルハイフンで始まっていない限り、-eはオプションです。 grepは、パターンとして最初の非オプション引数を自動的に受け取ります。

63
Adam Rosenfield

-eを使用する場合、パイプ記号をエスケープする必要があります。

tail -f logFile | grep -ve "string one\|string two"

編集:または @ Adam が指摘したように、-Eフラグを使用できます:

tail -f logFile | grep -vE "string one|string two"
5
Jay