N-PN White-Hat Project
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 Smile

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_log
ou ç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' Huh


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
pour le coup on a bien un delete inplace mais c'est justement ce qu'on ne veut pas et qui casse le tail -f

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` ))