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.

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

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)


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

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


15
tail -f admin.log|grep -v -E '(Nopaging the limit is|keyword to remove is)'

11

Vous pouvez utiliser un grep normal comme ceci:

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


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"

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