Jai un ensemble de fichiers journaux que je dois examiner et je voudrais rechercher des chaînes spécifiques sur les mêmes fichiers à la fois. Est-ce possible? Jutilise 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 cest quelque chose qui doit être scripté, quelquun peut-il fournir un script simple pour le faire?

Réponse

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

Commentaires

  • Comment faire pour que grep ignore les répertoires, tout en vérifiant tout de manière récursive des dossiers? grep -E 'text' **/* fonctionne, mais donne un message derreur pour chaque sous-répertoire (puis vérifie correctement tous les fichiers quil contient)
  • @Jorn, vous devriez vraiment poser une nouvelle question, mais utilisez find . -type f -exec grep -E 'fatal|error|critical|failure|warning' {} +
  • Jobtiens grep: invalid max count, donc jai utilisé la réponse jherrans

Réponse

Vous pouvez utiliser quelque chose comme ceci:

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

Ce sera trouver chaque fichier avec .log comme extension et appliquer la commande grep.

Commentaires

Answer

Si cest cest plus simple, vous pouvez simplement spécifier chaque fichier lun après lautre.

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

Réponse

Si vous avez besoin pour 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 lavantage 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 la coller.

Réponse

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 manquantes files

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

Jétais juste en train dexpérimenter cela moi-même pour faire des commandes qui fonctionnent sur plusieurs distributions où il est dans un fichier par rapport à lautre en raison des différences de système dexploitation.

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: Y a-t-il un moyen de faire référence à plusieurs fichiers dans un répertoire sans retaper le chemin complet?

Réponse

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

Il recherchera récursivement dans le fichier de sous-répertoires s aussi

egrep -r "string1|string2" pathname 

Commentaires

Réponse

Cétait une tâche très longue. Et oui, il fallait certainement un script si vous allez rechercher plusieurs chaînes dans plusieurs journaux différents en même temps. Mais jai récemment dû le faire et cétait assez douloureux. Néanmoins, cest 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: Surveiller des 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 

Notes:

Le _P_ signifie OU – Il remplace le tube « | » s ymbol 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 le répertoire journal à surveiller
  2. Lâge un fichier journal doit être pour quil soit surveillé..ie ne surveillez ni ne découvrez aucun fichier journal dont lhorodatage est supérieur à 60 minutes
  3. Les chaînes / motifs que vous souhaitez surveiller
  4. La balise – cest lavant-dernier argument que vous devez fournir. Elle enregistre les statistiques sur le ou les fichiers journaux que vous surveillez sous / var / tmp / logXray
  5. Loption de journal -ndshow – Cest le paramètre que vous souhaitez utiliser si vous souhaitez afficher les entrées des journaux trouvés correspondant au (x) modèle (s) que vous avez spécifié (s).Si vous voulez juste 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 laffiche 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 

Systèmes dexploitation: Ceci a été testé sur Ubuntu et Red Hat

Answer

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

Ceci recherchera « fatal ou erreur ou critique ou échec ou avertissement ou chaîne de recherche » dans les fichiers dont le nom commence par « log_file? » et lextension « lo  » * dans le chemin / chemin / vers / le / fichier / et donnez à la chaîne de recherche une couleur aléatoire et imprimez le numéro de ligne où elle a été trouvée.

Commentaires

  • Bien sûr, cest une réponse fonctionnelle, mais lutilisateur a demandé une recherche à laide dun modèle, vous avez répondu en utilisant une chaîne de recherche fixe. Désolé, mais lajout déléments qui nont pas été demandés, comme la numérotation des lignes et la coloration des résultats, ne rendra probablement pas une réponse plus bénéfique. Mais il y aura dautres questions auxquelles vous pourrez probablement répondre à vos compétences en grep, alors bonne chance dans votre carrière USE!
  • @zagrimsan point pris, je ‘ jai ajouté le -E ‘ fatal | error | critical | failure | warning | ‘ paramétré dessus.
  • Et bon, il a spécifiquement demandé plusieurs fichiers, pas un modèle de recherche. Veuillez relire la question.
  • Citation de la question:  » rechercher des chaînes spécifiques « , et la question saffiche le modèle de recherche (contenant plusieurs chaînes à rechercher) quil utilise. Vous avez raison de dire que le titre de la question est légèrement différent de ce quil demande réellement. BTW, -E et -F peuvent ‘ t être utilisés en même temps, ils sont conflit (faute de frappe?).

Réponse

JigarGandhi « La réponse montre lutilisation du caractère générique astérisque. Il y en a dautres et vous pouvez les voir ici ou en exécutant man 7 glob.

Lun dentre eux que jai trouvé utile est la plage correspondant à []. Puisque le système sur lequel je travaille produit un journal numéroté séquentiellement fichiers par exemple product.log.1 product.log.2 ... product.log.200 , il est pratique de grep avec une seule commande sur 3 ou 4 fichiers séquentiels mais pas plus. Donc, ceci

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 nest pas nécessaire pour être à la fin pour que la réponse de flickerfly «  soit simplifiée en

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

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *