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?


É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".


12

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


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'
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.