#1 Le 19/10/2010, à 22:41
- cayetanensis
[Résolu] Ne conserver que les dernières lignes d'un fichier
Bonjour,
Voilà, j''ai des fichiers de logs qui comportent des dizaines de lignes et qui grossissent à vue d'œil. Je cherche donc à trouver une astuce qui me permette de ne garder que les 10 dernières par exemple. J'avais pensé faire un truc du genre
tail machin.log > machin.log
Mais ça marche pas, le fichier machin.log ainsi créé est vide. Je comprends pas trop pourquoi. Du coup j'ai pas trop d'idée à part passer par un fichier temporaire, mais ça alourdi drôlement le code
tail machin.log > temp.log
cat temp.log > machin.log
rm temp.log
Ça marche mais ça me plaît pas. Quelqu'un a une meilleur idée ?
Dernière modification par cayetanensis (Le 20/10/2010, à 07:55)
cayetanensis
Hors ligne
#2 Le 19/10/2010, à 22:48
- CNE007
Re : [Résolu] Ne conserver que les dernières lignes d'un fichier
tail -n50 le-non-du-fichier-dont-tu-veux-les 10-dernières-lignes > machin
pour ton info google peux aider ou man tail
Hors ligne
#3 Le 19/10/2010, à 22:52
- cayetanensis
Re : [Résolu] Ne conserver que les dernières lignes d'un fichier
C'est gentil, mais avant de répondre google ou man à n'importe quelle question, essaie de la comprendre (tape cerveau dans google ou alors man cerveau ou bien cerveau --help )...
Mon problème c'est que je veux écrire directement dans le fichier que je lis sans passer par un fichier temporaire.
cayetanensis
Hors ligne
#4 Le 19/10/2010, à 22:56
- biotechman
Re : [Résolu] Ne conserver que les dernières lignes d'un fichier
bonjour cayetanensis,
lors d'un post précédent http://forum.ubuntu-fr.org/viewtopic.php?id=423303, j'ai eus le même "problème". Il faut que tu passes par un fichier temporaire. D'autant plus que le fichier temporaire n'est pas forcément mauvais, en cas d'erreur, tu peux garder une trace.
#!/bin/bash
for i in $(ls *.log);do
tail $i > tmp.log && cat tmp.log > $i || echo $i ": FAIL"
done
rm tmp.log
à la place du ls, tu peux mettre un find ou même enlever la boucle si c'est pour un fichier bien précis
Dernière modification par biotechman (Le 19/10/2010, à 22:57)
May the source be with you
http://biotechman.com/wordpress
Hors ligne
#5 Le 20/10/2010, à 00:31
- Watael
Re : [Résolu] Ne conserver que les dernières lignes d'un fichier
for file in *log; do
sed -i.bak ':a;$q;N;11,$D;ba' $file
done
si tes logs sont disséminés dans divers répertoires
find rep/départ -type f -iname "*log" -exec sed -i.bak ':a;$q;N;11,$D;ba' {} \;
à peu de chose près
Dernière modification par Watael (Le 20/10/2010, à 00:34)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#6 Le 20/10/2010, à 07:54
- cayetanensis
Re : [Résolu] Ne conserver que les dernières lignes d'un fichier
Fantastique, c'est exactement ce que je cherchais. Ça marche, mais par contre va falloir que je me penche sur ta syntaxe sed parce que là c'est un peu au-delà de mes compétences...
Bref j'ai intégré
sed -i ':a;$q;N;11,$D;ba' $HISTORIQUE
et du coup j'ai des historiques qui dépassent jamais 10 lignes.
Merci beaucoup !
cayetanensis
Hors ligne
#7 Le 20/10/2010, à 13:20
- Totor
Re : [Résolu] Ne conserver que les dernières lignes d'un fichier
Bonjour,
Une autre solution :
tail -n 10 "${HISTORIQUE}" > >(tee > "${HISTORIQUE}")
Note : il est important d'utiliser la substitution de processus et non un pipeline
-- Lucid Lynx --
Hors ligne
#8 Le 08/11/2010, à 18:25
- Postmortem
Re : [Résolu] Ne conserver que les dernières lignes d'un fichier
Salut Watael,
Tu me ferais une pitite explication de ton sed stp ?!?
for file in *log; do sed -i.bak ':a;$q;N;11,$D;ba' $file done
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne