web-dev-qa-db-fra.com

Comment rechercher des lignes contenant des mots particuliers dans un fichier journal?

J'ai un gros fichier journal que j'essaie de scanner pour certains mots. En général, j'aurai quelques mots dont j'ai besoin pour grep sur mon gros fichier journal et imprimer la ligne qui contient ces mots.

Je sais comment faire un simple grep sur un fichier. Supposons que mon nom de fichier soit abc.log et j'ai besoin de trouver une ligne qui contient le mot "bonjour" alors je le fais toujours comme ça et il imprime la ligne pour moi.

grep -i "hello" abc.log

Mais je ne sais pas comment faire la grep pour une 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 diviserai ma variable de données et rechercherai bonjour Word dans abc.log donc toute ligne qui contient bonjour Word, je l'imprimerai et de la même manière avec world et tester également.

J'essaie de rendre cela assez générique de sorte que j'ai juste besoin d'ajouter ma liste de mots dans la variable de données sans toucher à la logique réelle de saluer les journaux.

12
john

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

Depuis 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 connaissance des cas Edge intéressants suivants:

  • Vous pouvez lire la liste des modèles 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 <() (dans tous les cas)
  • Les performances de grep commencent à mal échouer si des centaines de modèles sont passés. Si votre cas d'utilisation est aussi insensé, envisagez de générer et d'exécuter immédiatement un script sed (ou un autre langage), bien que cela puisse potentiellement avoir des problèmes avec les modèles qui se chevauchent.
9
o11c

J'utiliserais une expression régulière, comme ceci:

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

En dehors de réponse de bruchowski , vous pouvez également utiliser:

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

OR

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

OR

egrep 'hello|world|tester' abc.log
1
Mandar Shinde