Problème de Performance avec l'analyse des fichiers journaux volumineux (~5) à l'aide de awk, grep, sed
Je suis actuellement en train de traiter les fichiers de log avec les dimensions approx. 5 go. Je suis assez nouveau à l'analyse des fichiers journaux et l'utilisation de UNIX bash, donc je vais essayer d'être aussi précis que possible. Lors de la recherche par le biais de fichiers journaux, je ne les suivants: fournir le numéro de la demande de chercher, puis, éventuellement, à fournir de l'action comme un filtre secondaire. Typique de commande ressemble à ceci:
fgrep '2064351200' example.log | fgrep 'action: example'
C'est très bien traiter avec des fichiers plus petits, mais avec un fichier journal qui est de 5 go, c'est insupportablement lent. J'ai lu en ligne, c'est génial à utiliser sed ou awk pour améliorer les performances (ou peut-être même une combinaison des deux), mais je ne suis pas sûr de savoir comment cela se fait. Pour exemple, l'utilisation de awk, j'ai un typique de commande:
awk '/2064351200/{print}' example.log
Fondamentalement, mon but ultime est de pouvoir imprimer/retour les enregistrements (ou de numéro de ligne) qui contiennent les chaînes (peut-être jusqu'à 4-5, et j'ai lu la tuyauterie est mauvais) pour correspondre dans un fichier journal efficacement.
Sur une note de côté, dans le shell bash, si je veux utiliser awk et faire un peu de traitement, comment est-il réalisé? Par exemple:
BEGIN { print "File\tOwner" }
{ print $8, "\t", \
$3}
END { print " - DONE -" }
Qui est assez simple script awk, et je suppose que il y a un moyen de le mettre en une seule ligne de commande bash? Mais je ne suis pas sûr de savoir comment la structure est.
Merci d'avance pour l'aide. Des acclamations.
merci pour les conseils, mais si je dois effectuer la recherche sur un fichier journal qui est constamment mise à jour tout au long de la journée, je suis en supposant que cette technique n'est pas applicable? Depuis que j'aurais à mettre constamment à jour le fichier enregistré
Il y a un nouveau logiciel opensource de projet international-characters.com/icgrep c'est un "parallèle bitstream mise en œuvre". Je n'ai pas essayé le logiciel, mais il peut être rapide.
OriginalL'auteur Albert | 2011-08-25
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin pour effectuer quelques tests pour savoir où votre goulets d'étranglement et à quelle vitesse vos différents outils d'effectuer. Essayez quelques tests de ce genre:
Traditionnellement, egrep devrait être le plus rapide de la bande (oui, plus vite que fgrep), mais certains les implémentations modernes sont adaptatives et de basculer automatiquement vers le bon algorithme de recherche. Si vous avez bmgrep (qui utilise le Boyer-Moore algorithme de recherche), essayez que. Généralement, sed et awk sera plus lent parce qu'ils sont conçus comme des fins plus générales de texte outils de manipulation plutôt que d'être à l'écoute pour le travail spécifique de recherche. Mais cela dépend vraiment de la mise en œuvre, et la bonne façon de le savoir est de faire des tests. Exécuter chaque plusieurs fois afin de ne pas se faire massacrer par des choses comme la mise en cache et de processus concurrents.
@Ron l'a souligné, de votre processus de recherche peut être disk I/O bound. Si vous être à la recherche du même fichier de journal d'un certain nombre de fois, il peut être plus rapide pour compresser le fichier journal de la première; cela le rend plus rapide la lecture de disque, mais alors besoin de plus de temps PROCESSEUR pour traiter, car il doit être décompressé en premier. Essayez quelque chose comme ceci:
J'ai juste couru un test rapide avec une assez compressible fichier texte, et a constaté que bzip2 comprimé mieux, mais a ensuite pris beaucoup plus de temps PROCESSEUR pour décompresser, de sorte que le zgip option de liquidation être le plus rapide dans l'ensemble. Votre ordinateur sera différent de disque et les performances du PROCESSEUR que le mien, afin que vos résultats peuvent être différents. Si vous avez d'autres compresseurs qui traînent, les essayer, et/ou d'essayer les différents niveaux de la compression gzip, etc.
Parlant de prétraitement: si vous êtes à la recherche de ce même journal, est-il possible de présélectionner juste les lignes de log que vous pourrait être intéressés? Si oui, grep dans une plus petite (peut-être compressé) fichier, puis de la recherche qu'au lieu de l'ensemble de la chose. Comme avec la compression, vous passez un peu de temps supplémentaire à l'avant, mais alors, chaque individu de la recherche s'exécute plus rapidement.
Une remarque sur la tuyauterie: les autres choses étant égales par ailleurs, de la tuyauterie d'un fichier énorme à travers de multiples commandes sera plus lent que d'avoir une seule commande de faire tout le travail. Mais toutes les choses ne sont pas égaux, et si l'utilisation de plusieurs commandes dans un tuyau (qui est ce que zgrep et bzgrep ne) vous permet d'acheter une meilleure performance globale, d'aller pour elle. Aussi, demandez-vous si vous êtes réellement en passant toutes les données à travers l'ensemble de la pipe. Dans l'exemple que vous avez donné,
fgrep '2064351200' example.log | fgrep 'action: example'
, la première fgrep jetez la plupart du fichier, la pipe et la seconde commande uniquement à traiter de la petite fraction du journal qui contient '2064351200', de sorte que le ralentissement sera probablement négligeable.tl;dr TESTER TOUTES LES CHOSES!
EDIT: si le fichier journal est "live" (c'est à dire de nouvelles entrées sont ajoutées), mais l'essentiel est statique, vous pouvez être en mesure d'utiliser un partiel prétraiter approche: compresser (& peut-être pré-scan) le journal, puis lors de la numérisation de l'utilisation de la compression (&/prescanned) version plus une queue de la partie du journal ajoutée, puisque vous n'avez que le prescan. Quelque chose comme ceci:
Si vous allez faire plusieurs recherches liées (par exemple, une demande particulière, puis des actions spécifiques à la demande), vous pouvez enregistrer prescanned versions:
sed
script peut être optimisé légèrement vers la sortie dès qu'il y a un match (en supposant que c'est un identifiant unique).sed -n '/2064351200/{;p;q;}'
Certes, vous pourriez le faire dans awk, trop.ma compréhension est que l'affiche a besoin de voir tous les matches, pas seulement de vérifier pour un match. La raison pour laquelle je suis jeter de sortie (">/dev/null") c'est parce que ce sont juste des tests de vitesse.
Il n'est pas clair à partir de la question de savoir si "le numéro de la demande" correspond à une ligne ou à plusieurs. Même dans de nombreux cas, si les matches sont tous regroupés, vous pouvez optimiser par la fermeture quand vous voyez le premier non-match après match.
merci pour les conseils, malheureusement la plupart de ces travaux seront à la recherche d'un journal en temps réel du fichier. Je pense que cela signifie que les méthodes de compression ne sont pas applicables? Merci pour ton explication sur les options de grep. Comme pour le test, vous avez raison, egrep a été le plus rapide et par une marge par rapport à l'autre 4 options (qui ont été autour de la même). Merci pour votre aide!
malheureusement, les matchs ne sont pas regroupés. Mais c'est une bonne technique, j'ai visité: sortie si un nombre prédéfini de matchs ont été récupérées.
OriginalL'auteur Gordon Davisson
Si vous ne connaissez pas la séquence des chaînes, puis:
Si vous savez qu'ils apparaissent l'un après l'autre dans la ligne:
(note pour awk,
{print}
est l'action par défaut du bloc, de sorte qu'il peut être omis si la condition est donnée)À faire avec les fichiers que les grands est lente, peu importe comment vous le trancher.
OriginalL'auteur glenn jackman
De multi-programmes en ligne sur la ligne de commande,
Notez les guillemets simples.
OriginalL'auteur hemflit
Si vous traitez plusieurs fois le même fichier, il pourrait être plus rapide à lire dans une base de données, et peut-être même créer un index.
OriginalL'auteur tripleee