Comment grep pour les lignes qui contiennent des mots particuliers dans un fichier journal?

J’ai un gros fichier journal que j’essaie de scanner pour un mot particulier. En général, j’aurai peu de mots à écrire sur mon gros fichier journal et à imprimer la ligne contenant ces mots.

Je sais comment faire un simple grep sur un fichier. Supposons que si mon nom de fichier est abc.log et que je abc.log trouver une ligne contenant le mot “hello”, je le fais toujours comme cela et il imprime la ligne pour moi.

 grep -i "hello" abc.log 

Mais je ne sais pas comment faire le grep pour la combinaison de mots. Ce qui signifie que j’aurais une liste de mots et je scannerai mon fichier abc.log pour tous ces mots et j’imprimerai les lignes qui contiennent ces mots individuellement.

 #!/bin/bash data="hello,world,tester" # find all the lines which contains word hello or world or tester 

Donc, dans mon script shell ci-dessus, je vais diviser ma variable de données et chercher un mot bonjour dans abc.log, donc toute ligne contenant un mot bonjour, je l’imprimerai de la même manière avec world et testeur.

J’essaie de rendre cela assez générique pour que j’aie juste besoin d’append ma liste de mots dans la variable de données sans toucher à la logique même de la création des journaux.

Si vous stockez vos patterns dans un fichier, un par ligne, vous pouvez utiliser grep -f file-with-patterns file-to-search.log

De la page de manuel:

  -f FILE, --file=FILE Obtain patterns from FILE, one per line. The empty file contains zero patterns, and therefore matches nothing. (-f is specified by POSIX.) 

Modifier 2018:

Depuis que j’ai écrit ceci, j’ai pris conscience des cas intéressants suivants:

  • Vous pouvez lire la liste des patterns de pipe en utilisant -f - (si vous n’avez pas besoin de stdin, c’est-à-dire que vous avez spécifié des fichiers sur la ligne de commande de grep) ou -f <() (en tout cas)
  • Les performances de grep commencent à échouer si des centaines de patterns sont transmis. Si votre cas d'utilisation est si insensé, envisagez de générer et d'exécuter immédiatement un script sed (ou un autre langage), même si cela peut potentiellement poser des problèmes de chevauchement de modèles.

Je voudrais utiliser une expression régulière, comme ceci:

 grep -E 'hello|world|tester' abc.log 

Outre la réponse de bruchowski , vous pouvez également utiliser:

 grep -i -e "hello" -e "world" -e "tester" abc.log 

OU

 grep 'hello\|world\|tester' abc.log 

OU

 egrep 'hello|world|tester' abc.log