Existe-t-il un moyen plus simple de faire cela? grep -v foo file | grep -v bar

Il existe probablement des moyens très élégants de le faire avec egrep, mais comment utiliser le vieux grep?

EDIT: grep -v "foo\|bar" file semble fonctionner uniquement avec GNU grep. Je « m sous Solaris. Une solution pour cela?

Commentaires

  • Question étrange car dans le premier exemple vous faites une correspondance AND, et dans le second vous faites une correspondance OR . Le résultat ne sera le même que dans des conditions très spécifiques.
  • Non, pas vraiment. Dans le deuxième exemple, lindicateur -v est une négation. not(A or B) == not(A) and not(B)

Réponse

Vous pouvez avoir plusieurs tests dans un une seule commande grep en passant chaque expression avec un argument -e au lieu de comme premier argument sans option comme vous le voyez normalement:

$ grep -v -e foo -e bar file 

Cela dit la même chose que votre commande: affiche les lignes de file qui ne contiennent ni « foo » ni « bar » .

Gardez à lesprit que la suppression de -v inverse complètement cela; cela change aussi lopération logique! Vous obtenez toutes les lignes contenant « foo » ou « bar ».

Answer

grep -Ev "word1|word2" devrait fonctionner correctement

Commentaires

  • Comme alternative, vous pouvez utiliser egrep et supprimer la barre oblique inverse pour le caractère pipe: egrep -v 'word1|word2
  • Il savère que cela ne fonctionne pas avec le grep Solaris. Jai installé le grep GNU et jai parfaitement fonctionné. Je ' je vais éditer ma question pour la rendre spécifique à Solaris.
  • @rahmu \| est un grep GNU extension, mais vous pouvez réaliser la même chose de manière portable avec -E et lopérateur |.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *