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.
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:
-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)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.J'utiliserais une expression régulière, comme ceci:
grep -E 'hello|world|tester' abc.log
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