複数の引数でgrep -vを使用する


12

これを行う簡単な方法はありますか? grep -v foo file | grep -v bar

おそらく非常にエレガントな方法でegrepを使用する方法がありますが、プレーンな古いgrepを使用する方法は?

編集:grep -v 'foo\|bar' fileGNU grepでのみ動作するようです。私はSolarisを使用しています。そのための解決策はありますか?


奇妙な質問です。最初の例ではAND一致、2番目の例ではOR一致です。結果は非常に特定の条件でのみ同じになります。
greenoldman '10

1
いいえ、そうではありません。2番目の例では、-vフラグは否定です。not(A or B) == not(A) and not(B)
rahmu

回答:


21

通常のように、最初の非オプション引数としてではなくgrep-e引数を使用して各式を渡すことにより、単一のコマンドで複数のテストを行うことができます。

$ grep -v -e foo -e bar file

これは、コマンドが実行するのと同じことです。file「foo」も「bar」も含まない行を出力します。

-v完全に削除すると、これが反転することに注意してください。論理演算も変更されます!「foo」または「bar」を含むすべての行を取得します。


12

grep -Ev 'word1|word2' うまく機能するはずです


別の方法として、あなたはegrepを使用することができますし、パイプ文字のためのバックスラッシュをドロップ:egrep -v 'word1|word2
OldTimer

これはSolaris grepでは機能しないことがわかりました。私はGNU grepをインストールして完全に動作しました。質問を編集して、Solaris固有のものにします。
rahmu 2011

2
@rahmu \|はGNU grepの拡張機能ですが-E|演算子を使用すると、移植可能な方法で同じことを実現できます。
Gilles「SO-邪悪なことをやめ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.