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?

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

Réponses:

61
grep -E 'fatal|error|critical|failure|warning|' *.log
JigarGandhi
la source
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.

Jherran
la source
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 
papillotement
la source
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.

Diego Pino
la source
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
Praveen Kumar BS
la source
1
à propos de egrep
Jeff Schaller
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

Surveillance Nagios
la source
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é.

Obaid
la source
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.

Stelios Adamantidis
la source
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 [email protected] /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 [email protected] /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?

Mike
la source