effacer toutes les lignes sauf les 10 dernieres sans détruire le fichier - Version imprimable +- N-PN White-Hat Project (https://dev.n-pn.fr/forum) +-- Forum : Informatique (https://dev.n-pn.fr/forum/forumdisplay.php?fid=12) +--- Forum : GNU/Linux | Unix (https://dev.n-pn.fr/forum/forumdisplay.php?fid=31) +--- Sujet : effacer toutes les lignes sauf les 10 dernieres sans détruire le fichier (/showthread.php?tid=3384) |
effacer toutes les lignes sauf les 10 dernieres sans détruire le fichier - gruik - 24-10-2013 j'ai hésité à poster dans les challenges de la communauté, en tous cas j'ai pas de solution pour le moment donc je suis preneur on a un fichier de log, le but donc c'est de ne garder que les 10 dernieres lignes et effacer tout le reste, le tout sans opération destructive c'est à dire que si j'avais un tail -f sur mon fichier il doit pouvoir continuer de fonctionner, aka "inplace" RE: effacer toutes les lignes sauf les 10 dernieres sans détruire le fichier - levur - 24-10-2013 et si tu fais une redirection en boucle du style : Citation :tail 10 -f le_log >> le_logou ça constitue une destruction de ton fichier ? ou encore tu stocke dans une var les 10 last ligne puis tu les insert dans ton fichier le tout avec un awk ? je saisi pas trop la != entre 'opération destructive' et 'effacer tout le reste' RE: effacer toutes les lignes sauf les 10 dernieres sans détruire le fichier - gruik - 24-10-2013 (24-10-2013, 14h06)levur a écrit : tail 10 -f le_log >> le_log wat ? non. non de toutes façons c'est moi qui n'étais pas réveillé ce matin et racontais passablement n'importe quoi en fait je pensais à quelque chose du genre Code : sed -i 1,$((`wc -l < fichier` - 10))d fichier la solution est simple, pas se casser la tête : Code : echo "$(tail -n10 fichier)" > fichier fin de l'histoire RE: effacer toutes les lignes sauf les 10 dernieres sans détruire le fichier - b0fh - 24-10-2013 La solution avec echo va foirer lamentablement passé une certaine taille (limitation de la taille max des arguments a une commande) Ca fait lance run message d'erreur à tail, mais techniquement, pour effacer les n dernières lignes d'un fichier en préservant le reste, l'approche correcte est de faire un truncate, soit avec la commande idoine, soit avec dd: Code : truncate -s $((`wc -c <"$fichier"` - `tail -n $lignes |wc -c` )) "$fichier" Code : dd if=/dev/null bs=1 of="$fichier" seek=$((`wc -c <"$fichier"` - `tail -n $lignes |wc -c` )) |