Utilisation de grep -v sur plusieurs arguments

12

Existe-t-il un moyen plus simple de procéder? grep -v foo file | grep -v bar

Il y a probablement des façons très élégantes de le faire avec egrep, mais comment aller avec du vieux grep ordinaire?

EDIT: grep -v 'foo\|bar' filesemble fonctionner uniquement avec GNU grep. Je suis sur Solaris. Une solution pour ça?

rahmu
la source
Étrange question parce que dans le premier exemple, vous faites une correspondance ET, et dans le second, vous faites une correspondance OU. Le résultat ne sera le même que dans des conditions très spécifiques.
greenoldman
1
Non, pas vraiment. Dans le deuxième exemple, le -vdrapeau est une négation. not(A or B) == not(A) and not(B)
rahmu

Réponses:

21

Vous pouvez avoir plusieurs tests dans une seule grepcommande en passant chaque expression avec un -eargument au lieu du premier argument sans option comme vous le voyez normalement:

$ grep -v -e foo -e bar file

Cela signifie la même chose que votre commande: imprimer des lignes filequi ne contiennent ni "foo" ni "bar".

Gardez à l'esprit que la suppression -vinverse complètement cela; cela change aussi le fonctionnement logique! Vous obtenez toutes les lignes qui contiennent "foo" ou "bar".

Warren Young
la source
12

grep -Ev 'word1|word2' devrait fonctionner très bien

Šimon Tóth
la source
Comme alternative, vous pouvez utiliser egrep et supprimer la barre oblique inverse pour le caractère de pipe:egrep -v 'word1|word2
OldTimer
Il s'avère que cela ne fonctionne pas avec le grep Solaris. J'ai installé GNU grep et j'ai parfaitement fonctionné. Je vais modifier ma question pour la rendre spécifique à Solaris.
rahmu
2
@rahmu \|est une extension GNU grep, mais vous pouvez réaliser la même chose de manière portable avec -Eet l' |opérateur.
Gilles 'SO- arrête d'être méchant'