grep exclut plusieurs chaînes

116

J'essaie de voir un fichier journal en utilisant tail -fet je souhaite exclure toutes les lignes contenant les chaînes suivantes:

"Nopaging the limit is"`  and `"keyword to remove is"

Je suis capable d'exclure une chaîne comme ceci:

tail -f admin.log|grep -v "Nopaging the limit is"

Mais comment exclure les lignes contenant l'un string1ou l' autre de ou string2.

Jeets
la source

Réponses:

107

Deux exemples de filtrage de plusieurs lignes avec grep:

Mettez ceci dans filename.txt:

abc
def
ghi
jkl

commande grep utilisant l'option -E avec un tube entre les jetons dans une chaîne:

grep -Ev 'def|jkl' filename.txt

imprime:

abc
ghi

Commande utilisant l'option -v avec un tube entre les jetons entouré de parenthèses:

egrep -v '(def|jkl)' filename.txt

imprime:

abc
ghi
Eric Leschinski
la source
15
Je suis surpris que personne ne parle de la grep -v -e def -e jklméthode qui
mon humble avis,
4
Ou encore mieux: grep -Fv -e def -e jklce qui est encore plus rapide!
Frizlab
11
Avec l'indicateur -F, vous pouvez utiliser des sauts de ligne comme délimiteurs au lieu de tuyaux. Cela permet d'utiliser plus facilement la sortie de commande comme filtre, par exemple:grep -vF $(pgrep myprocess)
Phlarx
45
grep -Fv -e 'Nopaging the limit is' -e 'keyword to remove is'

-F correspond par chaînes littérales (au lieu de regex)

-v inverse le match

-e permet plusieurs modèles de recherche (tous littéraux et inversés)

wisbucky
la source
1
C'est la bonne réponse: la seule qui évite à la fois les grep -vinstances multiples et l'exigence artificielle d'une expression régulière (permet aux chaînes multiples d'être spécifiées proprement dans des arguments séparés). Imaginez la construction de cette expression régulière par programme dans un script pour des chaînes qui pourraient contenir n'importe quoi…
user2394284
En fait, aucune de ces réponses n'est correcte, car lorsque vous ne passez aucun mot-clé à exclure, cela exclura tout au lieu de rien.
Győri Sándor le
37

Une autre option est de créer une liste d'exclusion, ceci est particulièrement utile lorsque vous avez une longue liste de choses à exclure.

vi /root/scripts/exclude_list.txt

Ajoutez maintenant ce que vous souhaitez exclure

Nopaging the limit is
keyword to remove is

Utilisez maintenant grep pour supprimer des lignes de votre fichier journal et afficher les informations non exclues.

grep -v -f /root/scripts/exclude_list.txt /var/log/admin.log
rezizter
la source
1
Je ne savais pas que vous pouviez utiliser -vavec -f(ou que ce dernier existait même).
Sridhar Sarnobat
très très utile!
samaspin
Notez que vous ne devez pas créer de fichier temporaire pour la liste d'exclusion. Dans bash, vous pouvez utiliser la substitution de processus. C'est pratique si la liste d'exclusion est assez dynamique et que vous deviez la générer avant chaque utilisation pour être utilisée une seule fois:grep -v -f <(gen_exclusions.sh) /var/log/admin.log
Miroslav
22
egrep -v "Nopaging the limit is|keyword to remove is"
Stefan Podkowinski
la source
15
tail -f admin.log|grep -v -E '(Nopaging the limit is|keyword to remove is)'
hs.chandra
la source
11

Vous pouvez utiliser un grep normal comme ceci:

tail -f admin.log | grep -v "Nopaging the limit is\|keyword to remove is"

Mikhail
la source
1
Cette réponse a fonctionné pour moi sur MacOSX. Échapper à la pipe est la clé
Rebecca Dessonville
5

Les greps peuvent être enchaînés. Par exemple:

tail -f admin.log | grep -v "Nopaging the limit is" | grep -v "keyword to remove is"
Fidel
la source
1
Le hic ici est qu'au lieu d'un processus qui filtrerait, vous devriez exécuter N processus séquentiellement, où chacun d'eux filtre quelque chose. Cela pourrait ralentir considérablement les choses.
Artem Oboturov