57

正規表現の -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

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

これどうやってするの?

4

2 に答える 2

92

問題は、デフォルトでは、適切な代替を取得するために | をエスケープする必要があることです。つまり、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 は、最初の非オプション引数をパターンとして自動的に受け取ります。

于 2008-12-12T20:57:06.770 に答える
7

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

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

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

tail -f logFile | grep -vE "string one|string two"
于 2008-12-12T20:57:47.453 に答える