正規表現の-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
()または引用符を使用してみましたが、機能するものを見つけることができませんでした。
これどうやってするの?
問題は、デフォルトでは、適切な代替を得るために|をエスケープする必要があることです。つまり、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は、パターンとして最初の非オプション引数を自動的に受け取ります。
-eを使用する場合、パイプ記号をエスケープする必要があります。
tail -f logFile | grep -ve "string one\|string two"
編集:または @ Adam が指摘したように、-Eフラグを使用できます:
tail -f logFile | grep -vE "string one|string two"