Extraire des lignes d'un fichier log

Bonjour à tous !

J’ai un service DHCP en place sous Debian, j’ai fait redirigé les log DHCP vers un fichier spécifique. Maintenant que ces données là sont répertoriées, j’aimerais pouvoir extraire certaines lignes contenant des mots clés comme “DHCPACK” (sachant qu’une ligne peut se trouver sur deux oO) et les envoyer vers un nouveau fichier log.

La commande serait du style tail -f mon_fichier_log > grep -e “regexp” > nouveau_fichier_log

Mais je ne maîtrise pas du tout les regexps.

Quelqu’un peut-il m’aider ?

Merci d’avance

Bonjour,

Pour récupérer les lignes contenants “DHCPACK” avec la ligne suivante :

Quand j’exécute cette commande, effectivement il me sort les lignes contenants DHCPACK mais pas seulement ! J’ai fait un screen pour vous montrer. De plus j’aimerais intégrer cette commande à celle du premier post pour pouvoir rediriger les résultats vers un autre fichier log.

L’option --after-context=1 permet de sélectionner une ligne de “contexte” après la ligne contenant “DHCPACK”. Peut-être ai-je mal compris ton besoin, auquel cas tu peux retirer l’option.

[edit] c’est un | et non un > entre le tail et le grep

Concernant l’after-context, c’est de ma faute je me suis mal exprimé.

Cette commande ne fonctionne pas, le message d’erreur est:

“tail: impossible d’ouvrir “DHCPACK” en lecture: Aucun fichier ou dossier de ce type”

Je viens d’éditer (juste avant que tu post) mon post du dessus car il y avait une petite erreur.

Merci. Le problème de cette commande est qu’elle tourne en boucle.

Du coup je suis obligé de faire "grep “DHCPACK” /var/log/dhcpd.log > /var/log/toto.log"
Puis tail /var/log/toto.log pour visualiser les résultats.

Mais ce fonctionnement oblige à toujours exécuter la première commande; je ne penses pas que ce soit possible mais existe t-il un moyen pour que ce soit simultané ? création d’un script ??

Je ne suis pas sur de comprendre ce que tu veux faire.

Soit tu laisses tourner en tâche de fond la première commande et tu consultes le nouveau_fichier_log quand tu en as besoin.

Soit tu lance le grep seulement quand tu en as besoin. Si tu veux alors avoir le résultat et dans un fichier et à l’écran, tu peux utiliser “tee” :

Laisser tourner en tâche de fond la première commande, d’accord mais j’aimerais pouvoir utiliser mon serveur en même temps; ce qui n’était pas le cas quand j’exécutais cette commande (obligé de faire Ctrl + c pour sortir).

Pour lancer une commande en tâche de fond, il suffit d’ajouter un & à la fin de la commande :

Et si tu as oublié le &, tu peux passer la commande en arrière plan en faisant Ctrl+z puis en entrant la commande bg.

D’accord. Mais quand j’exécute cette commande le fichier que je souhaite remplir est vide alors qu’il se remplit correctement lorsque je fait uniquement la commande grep.

tail -f retourne les 10 dernières lignes (paramétrable avec l’option -n) du fichier + les lignes qui sont ajoutées dans le fichier après le lancement de la commande. Alors qu’en faisant uniquement le grep, le fichier est lu en entier à un instant t.

On peut éventuellement combiner le deux comme ceci :

Mais on n’est pas à l’abri de louper des lignes entre le premier grep et le tail.

Ce qui est fou, c’est que cela fonction avec DHCPDISCOVER mais pas avec DHCPACK alors que quand je visualise mon fichier log principal, il y a du DHCPACK ! :confused:

Qu’est-ce qui fonctionne avec DHCPDISCOVER mais pas avec DHCPACK ? (quelles commandes ?)

tail -f -n 0 mon_fichier_log | grep “DHCPDISCOVER” > nouveau_fichier_log &

Cette commande remplit correctement le fichier mais pas quand je remplace DHCPDISCOVER par DHCPACK.

Ces lignes sont bien arrivées dans mon_fichier_log après que tu ais lancé la commande ? (car la commande ne lit que les lignes qui arrivent dans le fichier après son lancement)

Pour tester, tu peux créer de nouvelle ligne dans mon_fichier_log avec la commande :

J’ai fait exactement ça et il n’y a toujours rien dans le nouveau fichier alors que si je fais simplement un grep “DHCPACK” mon_fichier_log, je vois bien la ligne que j’ai fait afficher !

Peux-être (et j’ai plus beaucoup d’idée) en remplaçant tail -f par tail -F ?

[quote=“jeremetalain”]J’ai fait exactement ça et il n’y a toujours rien dans le nouveau fichier alors que si je fais simplement un grep “DHCPACK” mon_fichier_log, je vois bien la ligne que j’ai fait afficher ![/quote]Juste par curiosité:

wc -l /ton/fichier/log(-l => L minuscule… :wink: )
et

grep -n DHCPACK /ton/fichier/log

:006

[quote=“Num’s”]Juste par curiosité:

J’obtiens 129895 /ton/fichier/log

[quote=“Num’s”]
et

La dernière a le numéro 129888.