Comment grep pour la même chaîne mais plusieurs fichiers en même temps?


57

J'ai un ensemble de fichiers journaux à réviser et j'aimerais rechercher des chaînes spécifiques dans les mêmes fichiers à la fois. Est-ce possible? J'utilise actuellement

grep -E 'fatal|error|critical|failure|warning|' /path_to_file

Comment utiliser ceci et rechercher les chaînes de plusieurs fichiers à la fois? Si c'est quelque chose qui doit être scripté, quelqu'un peut-il fournir un script simple pour le faire?


2
greppeut prendre plus d'un argument de fichier.
Jw013

Réponses:


61
grep -E 'fatal|error|critical|failure|warning|' *.log

Comment puis-je grepsauter des répertoires tout en vérifiant tous les fichiers de manière récursive? grep -E 'text' **/*fonctionne, mais donne un message d'erreur pour chaque sous-répertoire (puis vérifie correctement tous les fichiers qu'il contient)
Jorn

4
@ Jorn, vous devriez poser une nouvelle question, mais utilisezfind . -type f -exec grep -E 'fatal|error|critical|failure|warning' {} +
Wildcard

20

Vous pouvez utiliser quelque chose comme ceci:

find . -name "*.log" | xargs grep -E 'fatal|error|critical|failure|warning|'

Cela trouvera tous les fichiers avec .logcomme extension et appliquera la grepcommande.


C’était trop facile :) En fait, tous mes fichiers sont au format .log, donc "grep -E 'fatal | erreur | critique | échec | avertissement" * .log fonctionne aussi. Merci!
user53029 Le

1
Quel grand effort de compréhension / adaptation user53029!
Gilles Quenot

1
Pourquoi s'embêter avec xargset la possibilité de casse grave sur les espaces blancs dans les noms de fichiers quand vous pouvez simplement utiliser find . -name '*.log' -exec grep -E 'fatal|error|critical|failure|warning' {} +?
Wildcard

16

Si c'est plus simple, vous pouvez simplement spécifier chaque fichier l'un après l'autre.

grep -E 'fatal|error|critical|failure|warning' file1.log file2.log 

2
Si simple, mais cherchait cela depuis trop longtemps: 0
Adam Hughes

3

Si vous avez besoin de grep sur un ensemble arbitraire de noms de fichiers qui ne peuvent pas être récupérés par une expression régulière:

grep -E 'fatal|error|critical|failure|warning|' `cat<<FIN
> file1
> file2
> ...
> filen
> FIN`

Quel est l'avantage de coller les noms de fichiers les uns après les autres? Vous pouvez compiler la liste des noms de fichiers sur un fichier texte, puis le coller.


1

Si vous souhaitez effectuer une recherche récursive dans les fichiers de sous-répertoires également, vous pouvez utiliser la commande ci-dessous.

Il va rechercher récursivement dans les fichiers de sous-répertoires également

egrep -r "string1|string2" pathname


0

Ce fut une tâche très fastidieuse. Et oui, il était certainement nécessaire de créer un script si vous voulez rechercher plusieurs chaînes dans plusieurs journaux différents en même temps. Mais j'ai récemment dû faire cela et c'était très douloureux. Néanmoins, il est prêt et prêt à être téléchargé à partir du lien suivant:

Log Search Script Télécharger

La façon dont cela fonctionne est assez simple.

Scénario 1: Surveillez UNE chaîne dans un seul fichier journal

./logsearch.sh localhost /var/tmp/logXray autonda /var/log/messages 60m 'can.*t.*open' '.'  1 2 single_errCheck -ndshow

Scénario 2: Surveillez plusieurs chaînes dans un seul fichier journal

./logsearch.sh localhost /var/tmp/logXray autonda /var/log/messages 60m 'can.*t.*open_P_ntpd.*stat' '.'  1 2 multi_errCheck -ndshow

Scénario 3: Surveiller les chaînes simples / multiples dans plusieurs fichiers journaux

./logsearch.sh localhost /var/tmp/logXray autonda /var/log 60m 'can.*t.*open_P_ntpd.*stat' '.'  1 2 multi_err_multi_logCheck -ndshow

Remarques:

Le _P_ signifie OU - Il remplace le tuyau "|" symbole car il est moins probable que vous deviez rechercher une chaîne contenant "_P_". Si vous ne souhaitez pas taper "_P_", vous pouvez simplement remplacer le _P_ par "|".

Lorsque vous utilisez ce script, les paramètres que vous allez modifier fréquemment sont les suivants:

  1. Le fichier journal ou le répertoire du journal à surveiller
  2. L'âge auquel un fichier journal doit être surveillé ... c'est-à-dire qu'il ne faut surveiller ni découvrir aucun fichier journal dont l'horodatage est supérieur à 60 minutes.
  3. La (les) chaîne (s) / motif (s) que vous souhaitez surveiller
  4. La balise - c’est l’avant-dernier argument que vous devez fournir. Il enregistre des statistiques sur les fichiers journaux que vous surveillez sous / var / tmp / logXray
  5. L'option de journal -ndshow - Il s'agit du paramètre que vous souhaitez utiliser si vous souhaitez générer les entrées à partir des journaux trouvés correspondant au (x) modèle (s) spécifié (s). Si vous voulez juste voir le nombre total de chaque motif trouvé, remplacez simplement '-ndshow' par '-ndfoundmul'.

En utilisant '-ndfoundmul', vous obtiendrez une sortie similaire à:

[root@dgphxtest001]# ./logsearch.sh localhost /var/tmp/logXray autonda /var/log/messages 60m 'can.*t.*open_P_ntpd.*stat' '.'  1 2 blahblahA -ndfoundmul
OK: [/var/log/messages][1]  /var/log/messages:P=(can_t_open=0 ntpd_stat=0)_F=(117s)_R=(228,228=0) 

Solution au problème de l'affiche originale: rechercher plusieurs chaînes dans plusieurs fichiers journaux

./logsearch.sh localhost /var/tmp/logXray autonda /var/log 60m 'fatal_P_error_P_critical_P_failure_P_warning' '.'  1 2 multierr_logCheck -ndshow

OS: Ceci a été testé sur Ubuntu et Red Hat


0
grep -EFn "fatal|error|critical|failure|warning|search-string" /path/to/the/file/log_file?.lo* --color=auto

Cela cherchera «fatale ou erreur ou critique ou échec ou avertissement ou chaîne de recherche» dans les fichiers dont le nom commence par «log_file? et extension 'lo ' * dans le chemin / chemin / vers / le / fichier / et donnez à la chaîne de recherche une couleur aléatoire et le numéro de ligne où il a été trouvé.


Bien sûr, cette réponse fonctionne, mais l’utilisateur a demandé à l’utilisateur d’effectuer une recherche à l’aide d’un modèle, vous avez répondu à l’aide d’une chaîne de recherche fixe. Désolé, mais l'ajout d'éléments qui n'ont pas été demandés, tels que la numérotation des lignes et la coloration des résultats ne rendra probablement pas la réponse plus bénéfique. Mais il y aura d'autres questions qui pourraient répondre à vos grepcompétences, alors bonne chance dans votre carrière USE!
Zagrimsan

@zagrimsan pris, j'ai ajouté le -E 'erreur fatale | critique | échec | avertissement |' param à elle.
Obaid

Et hé, il a spécifiquement demandé plusieurs fichiers, pas un modèle de recherche. Veuillez relire la question.
Obaid

Citation du Q: "rechercher des chaînes spécifiques", et la question montre le modèle de recherche (contenant plusieurs chaînes à rechercher) qu'il utilise. Vous avez raison de dire que le titre de la question est légèrement différent de ce qu’il demande réellement. BTW, -Eet -Fne peuvent pas être utilisés en même temps, ils sont en conflit (typo?).
Zagrimsan

0

La réponse de JigarGandhi démontre l'utilisation du caractère générique astérisque. Il y en a plus et vous pouvez les voir ici ou en courant man 7 glob.

L’un d’eux que j’ai trouvé utile est la plage de correspondance []. Étant donné que le système sur lequel je travaille produit des fichiers journaux numérotés de manière séquentielle product.log.1 product.log.2 ... product.log.200, par exemple , il est pratique de grep avec une seule commande sur 3 ou 4 fichiers séquentiels, mais pas davantage. Donc ça

grep 'whatever' product.log.[5-7]

grep pour tous les fichiers se terminant par product.log. 5, 6 ou 7. Le caractère générique n'est pas nécessaire pour être à la fin, donc la réponse de scintillement peut être simplifiée

grep -E 'fatal|error|critical|failure|warning' file[1,2].log

Notez également que ces caractères génériques peuvent être utilisés dans d'autres commandes, comme cppar exemple.


0

Vous pouvez également utiliser des accolades si les fichiers se trouvent tous dans le même dossier.

Voir un exemple

grep -E 'fatal|error|critical|failure|warning|' /var/log/{messages,secure,syslog,dmesg}

Si vous ajoutez un s au grep, cela supprime les erreurs concernant les fichiers manquants.

grep -sE 'fatal|error|critical|failure|warning|' /var/log/{messages,secure,syslog,dmesg}

J'essayais de le faire moi-même pour faire des commandes qui fonctionnent sur plusieurs distributions où il est dans un fichier par rapport à l'autre en raison de différences de système d'exploitation.

Journaux de courrier

sudo grep -is bob@example.com /var/log/{maillog,exim_mainlog,exim_rejectlog,mail.log,mail.err,syslog}

Journaux de courrier archivés utilisant 2> / dev / null pour supprimer zgrep des avertissements .gz manquants

sudo zgrep -is bob@example.com /var/log/{maillog*,exim_mainlog*,exim_rejectlog*,mail.log*,mail.err*,syslog*} 2>/dev/null

Référence: Y a - t-il un moyen de faire référence à plusieurs fichiers dans un répertoire sans retaper tout le chemin?

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.