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?
grep -E 'fatal|error|critical|failure|warning|' *.log
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
.
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
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.
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
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.1
product.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.
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:
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
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.
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