Agence web » Actualités du digital » Comment extraire et trier des colonnes à partir de fichiers journaux sous Linux

Comment extraire et trier des colonnes à partir de fichiers journaux sous Linux

Le tri d'un fichier journal par une colonne spécifique est utile pour trouver rapidement des informations. Les journaux sont généralement stockés sous forme de texte en clair, vous pouvez donc utiliser des outils de manipulation de texte en ligne de commande pour les traiter et les afficher de manière plus lisible.

Extraction de colonnes avec cut et awk

le cut et awk les utilitaires sont deux façons différentes d'extraire une colonne d'informations à partir de fichiers texte. Les deux supposent que vos fichiers journaux sont séparés par des espaces, par exemple:

column column column

Cela pose un problème si les données dans les colonnes contiennent des espaces blancs, tels que des dates («Wed Jun 12»). Tandis que cut peut voir cela comme trois colonnes distinctes, vous pouvez toujours extraire les trois à la fois, en supposant que la structure de votre fichier journal est cohérente.

cut est très simple à utiliser:

cat system.log | cut -d ' ' -f 1-6

le cat commande lit le contenu de system.log et les tuyaux à cut. le -d flag spécifie le délimiteur, dans ce cas étant un espace. (La valeur par défaut est tabulation, t.) Le -f L'indicateur spécifie les champs à afficher. Cette commande imprimera spécifiquement les six premières colonnes de system.log. Si vous ne souhaitez imprimer que la troisième colonne, vous devez utiliser le -f 3 drapeau.

awk est plus puissant mais pas aussi concis. cut est utile pour extraire des colonnes, comme si vous vouliez obtenir une liste d'adresses IP à partir de vos journaux Apache. awk peut réorganiser des lignes entières, ce qui peut être utile pour trier un document entier par une colonne spécifique. awk est un langage de programmation complet, mais vous pouvez utiliser une simple commande pour imprimer les colonnes:

cat system.log | awk '{print $1, $2}'

awk exécute votre commande pour chaque ligne du fichier. Par défaut, il divise le fichier en espaces blancs et stocke chaque colonne dans des variables $1, $2, $3, etc. En utilisant le print $1 , vous pouvez imprimer la première colonne, mais il n'y a pas de moyen facile d'imprimer une plage de colonnes sans utiliser de boucles.

Un avantage de awk est que la commande peut référencer la ligne entière à la fois. Le contenu de la ligne est stocké dans une variable $0, que vous pouvez utiliser pour imprimer la ligne entière. Ainsi, vous pouvez, par exemple, imprimer la troisième colonne avant d'imprimer le reste de la ligne:

awk '{print $3 " " $0}'

le " " imprime un espace entre $3 et $0. Cette commande répète la colonne trois deux fois, mais vous pouvez contourner cela en définissant le paramètre $3 variable à null:

awk '{printf $3; $3=""; print " " $0}'

le printf la commande n'imprime pas une nouvelle ligne. De même, vous pouvez exclure des colonnes spécifiques de la sortie en les définissant toutes sur des chaînes vides avant l'impression $0:

awk '{$1=$2=$3=""; print $0}'

Vous pouvez faire beaucoup plus avec awk, y compris la correspondance des expressions rationnelles, mais l'extraction de colonne prête à l'emploi fonctionne bien pour ce cas d'utilisation.

Tri des colonnes avec sort et uniq

le sort La commande peut être utilisée pour ordonner une liste de données basée sur une colonne spécifique. La syntaxe est:

sort -k 1

où le -k flag indique le numéro de colonne. Vous dirigez l'entrée dans cette commande et elle crache une liste ordonnée. Par défaut, sort utilise l'ordre alphabétique mais prend en charge plus d'options via des indicateurs, tels que -n pour le tri numérique, -h pour le tri des suffixes (1M> 1K), -M pour trier les abréviations des mois, et -V pour trier les numéros de version des fichiers (fichier-1.2.3> fichier-1.2.1).

le uniq La commande filtre les lignes en double, ne laissant que des lignes uniques. Il ne fonctionne que pour les lignes adjacentes (pour des raisons de performances), vous devrez donc toujours l'utiliser après sort pour supprimer les doublons dans tout le fichier. La syntaxe est simplement:

sort -k 1 | uniq

Si vous souhaitez répertorier uniquement les doublons, utilisez le -d drapeau.

uniq peut également compter le nombre de doublons avec le -c indicateur, ce qui le rend très bon pour le suivi de la fréquence. Par exemple, si vous souhaitez obtenir une liste des meilleures adresses IP qui frappent votre serveur Apache, vous pouvez exécuter la commande suivante sur votre access.log:

cut -d ' ' -f 1 | sort | uniq -c | sort -nr | head

Cette chaîne de commandes supprimera la colonne d'adresse IP, regroupera les doublons, supprimera les doublons tout en comptant chaque occurrence, puis triera en fonction de la colonne de comptage dans l'ordre numérique décroissant, vous laissant avec une liste qui ressemble à:

21 192.168.1.1
12 10.0.0.1
5 1.1.1.1
2 8.0.0.8

Vous pouvez appliquer ces mêmes techniques à vos fichiers journaux, en plus d'autres utilitaires comme awk et sed, pour extraire des informations utiles. Ces commandes chaînées sont longues, mais vous n'avez pas besoin de les saisir à chaque fois, car vous pouvez toujours les stocker dans un script bash ou les alias via votre ~/.bashrc.

Filtrage des données avec grep et awk

grep est une commande très simple; vous lui donnez un terme de recherche et lui transmettez l'entrée, et il crachera chaque ligne contenant ce terme de recherche. Par exemple, si vous souhaitez rechercher des erreurs 404 dans votre journal d'accès Apache, vous pouvez faire:

cat access.log | grep "404"

qui cracherait une liste d'entrées de journal correspondant au texte donné.

cependant, grep ne peut pas limiter sa recherche à une colonne spécifique. Cette commande échouera donc si vous avez le texte "404" ailleurs dans le fichier. Si vous souhaitez rechercher uniquement la colonne du code d'état HTTP, vous devez utiliser awk:

cat access.log | awk '{if ($9 == "404") print $0;}'

Avec awk, vous avez également l'avantage de pouvoir effectuer des recherches négatives. Par exemple, vous pouvez rechercher toutes les entrées de journal qui n’a pas retourner avec le code d'état 200 (OK):

cat access.log | awk '{if ($9 != "200") print $0;}'

ainsi que d'avoir accès à toutes les fonctionnalités de programmation awk fournit.

Options GUI pour les journaux Web

GoAccess est un utilitaire CLI pour surveiller le journal d'accès de votre serveur Web en temps réel, et trie par chaque champ utile. Il s'exécute entièrement dans votre terminal, vous pouvez donc l'utiliser sur SSH, mais il a également une interface Web beaucoup plus intuitive.

apachetop est un autre utilitaire spécifiquement pour apache, qui peut être utilisé pour filtrer et trier par colonnes dans votre journal d'accès. Il s'exécute en temps réel directement sur votre access.log.

★★★★★