La première chose au programme de ce billet, c'est apprendre à lire un log en temps réel (par exemple ici le fichier squid.log, généré par un squid et complété en continu) :
tail -f squid.log
Ça marche, mais compliquons un peu l'hypothèse de départ. On ajoute au système un logrotate qui va faire tourner le log toutes les 5 minutes (et qui va renommer squid.log en squid.log.YYYYMMDD.HHhMMmSSs). Si on continue avec notre tail précédent, toutes les cinq minutes on sera bon pour le relancer (le flux est cassé à la rotation). Heureusement, tail a une autre option, qui est plus robuste face à la suppression du fichier qu'on regarde :
tail -F squid.log
Et là c'est gagné. Maintenant, on va encore compliquer un peu et on va garder uniquement les lignes qui nous intéressent (qui contiennent le mot "motif"). Habituellement, quand on cherche une chaine de caractère dans un fichier de log en temps réel, on a tendance à grepper simplement :
tail -F squid.log | grep motif
Mais si on a face à nous une ligne qui se présente ainsi, on peut matcher des lignes qui ne vont pas forcément nous intéresser :
2011-02-21 15h54h10s motif_qui_nous_intéresse blabla blibli 2011-02-21 15h54h10s blabla motif_qui_ne_nous_intéresse_pas blibli
On a ici des lignes avec 5 colonnes séparées par des espaces, on veut uniquement grepper sur "motif" dans la troisième colonne :
tail -F squid.log | awk '$3 ~ "motif"'
Et éventuellement, si la colonne 4 ne nous intéresse vraiment pas, on peut même profiter du awk pour seulement afficher ce qui est pertinent :
tail -F squid.log | awk '$3 ~ "motif" {print $1,$2,$3,$5}'
J'en profite pour faire passer un rappel sur grep : non, on ne fait pas un cat pipe grep, un grep "motif" "fichier" suffit amplement, vous risquez de vous faire pendre ou brûler si vous osez faire ça.
Et en cadeau, un mémo sur awk : http://www.shellunix.com/awk.html
Commentaires
Ideal is the beacon. Without ideal, there is no secure direction; without direction ,there is no life.