web-dev-qa-db-fra.com

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

J'ai un ensemble de fichiers journaux que je dois consulter et je voudrais rechercher des chaînes spécifiques sur les mêmes fichiers à la fois Est-ce possible? Actuellement j'utilise

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

Comment utiliser cela 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 ce faire?

66
user53029
grep -E 'fatal|error|critical|failure|warning|' *.log
68
JigarGandhi

Vous pouvez utiliser quelque chose comme ceci:

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

Cela trouvera chaque fichier avec .log comme extension et appliquez la commande grep.

23
jherran

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 
20
flickerfly

Si vous devez 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 l'un après l'autre? Vous pouvez compiler la liste des noms de fichiers sur un fichier texte, puis la coller.

3
Diego Pino

Si vous souhaitez également rechercher récursivement dans les fichiers des sous-répertoires, vous pouvez utiliser la commande ci-dessous

Il recherchera récursivement dans les fichiers des sous-répertoires également

egrep -r "string1|string2" pathname
1
Praveen Kumar BS

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

L'un d'eux que j'ai trouvé utile est la plage correspondant à []. Comme le système sur lequel je travaille produit des fichiers journaux numérotés séquentiellement, par exemple product.log.1product.log.2...product.log.200, c'est pratique de grep avec une seule commande sur 3 ou 4 fichiers séquentiels mais pas plus. 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 d'être à la fin donc réponse de flickerfly peut être simplifié pour

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 ainsi que dans cp par exemple.

0
Stelios Adamantidis

C'était une tâche très longue. Et oui, il fallait certainement un script si vous souhaitez rechercher plusieurs chaînes dans plusieurs journaux différents en même temps. Mais j'ai récemment dû le faire et c'était assez douloureux. Néanmoins, il est fait et prêt et peut être téléchargé à partir du lien suivant:

Téléchargement du script de recherche de journal

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: Surveillance de chaînes uniques/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 OR - Il remplace le symbole du tube "|" 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 modifiez fréquemment sont:

  1. Le fichier journal ou répertoire de journaux à surveiller
  2. L'âge d'un fichier journal doit être pour qu'il soit surveillé .. i.e. ne surveillez ni ne découvrez aucun fichier journal dont l'horodatage est supérieur à 60 minutes
  3. Les cordes/motifs que vous souhaitez surveiller
  4. La balise - c'est l'avant-dernier argument que vous devez fournir. Il enregistre les statistiques sur les fichiers journaux que vous surveillez sous/var/tmp/logXray
  5. L'option log -ndshow - C'est le paramètre que vous souhaitez utiliser si vous souhaitez sortir les entrées des journaux trouvés correspondant au (x) modèle (s) que vous avez spécifié. Si vous voulez simplement voir le nombre total de chaque motif trouvé, remplacez simplement '-ndshow' par '-ndfoundmul'.

Lorsque vous utilisez '-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
Nagios Monitoring
grep -EFn "fatal|error|critical|failure|warning|search-string" /path/to/the/file/log_file?.lo* --color=auto

Cela recherchera 'fatal ou erreur ou critique ou échec ou avertissement ou chaîne de recherche' dans les fichiers avec le nom commençant par 'log_file?' et l'extension 'lo' * dans le chemin / chemin/vers/le/fichier / et donnez à la chaîne de recherche une couleur aléatoire et un numéro de ligne d'impression où elle a été trouvée.

0
Obaid

Vous pouvez également utiliser des accolades si les fichiers sont 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}

Je venais d'expérimenter cela moi-même pour faire des commandes qui fonctionnent sur plusieurs distributions où elles se trouvent dans un fichier contre l'autre en raison de différences de système d'exploitation.

Journaux de messagerie

Sudo grep -is [email protected] /var/log/{maillog,exim_mainlog,exim_rejectlog,mail.log,mail.err,syslog}

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

Sudo zgrep -is [email protected] /var/log/{maillog*,exim_mainlog*,exim_rejectlog*,mail.log*,mail.err*,syslog*} 2>/dev/null

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

0
mike