Jeter le contenu du fichier journal en gardant la queue

3

Je cherche un moyen de supprimer le contenu du fichier journal en ne laissant que la queue définie. En deux étapes, c'est assez simple:

tail -n1000 alert_migtst.log > alert_migtst.tail
mv -f alert_migtst.tail alert_migtst.log

Existe-t-il un moyen d’obtenir la même chose avec une seule commande, entre autres raisons d’éviter une éventuelle perte de lignes?

Ren
la source

Réponses:

2

Vous pouvez utiliser sed

sed -e :a -e '$q;N;1001,$D;ba' -i filename
  • -e définit un script (commande)
  • :a définit une étiquette
  • $qdéfinit une adresse ( $fin de fichier) et les branches qde ce
  • N ajoute la prochaine ligne d'entrée à l'espace de modèle
  • 1001,$dsupprime toute la ligne entre 1001 et la fin du fichier (à cause de la précédente, Nelles seront ajoutées à l'espace de modèle)
  • ba branches à l'étiquette définie au début

Par exemple (3 dernières lignes du fichier)

$ cat alert_migtst.log 
1
2
3
4
5
6
7
8
9
$ sed -e :a -e '$q;N;4,$D;ba' -i alert_migtst.log 
$ cat alert_migtst.log 
7
8
9
Matteo
la source
Honnêtement, j'espérais qu'il y aurait un moyen simple, comme une commande spéciale, mais ce n'est peut-être pas une tâche aussi habituelle que je le pensais. Mais cela fonctionnera sans outils supplémentaires, merci.
Ren
0

Vous pouvez essayer d'utiliser une éponge que vous pouvez installer avec le paquet moreutils. Il vous permet de rediriger la sortie sur le même fichier (sinon vous le supprimez).

   tail -n1000 alert_migtst.log | sponge alert_migtst.log

En règle générale, entraînez-vous avec toutes les solutions que vous avez trouvées avant de les utiliser sur des fichiers critiques.

Hastur
la source
Je ne peux pas installer de paquets supplémentaires juste pour une tâche, je vais donc utiliser sed. Merci quand même.
Ren
De rien. N'oubliez pas de tester tout ce que vous pouvez avec les fichiers en cours d' exécution, par exemple, avec la méthode que vous avez utilisée auparavant, vous pouvez manquer des lignes si elles sont imprimées entre-temps, si vous copiez le fichier temporaire dans le nouveau. Je ne sais pas comment le système peut gérer sedsi la taille change entre-temps, il agit. Je ne sais pas trop dans les détails spongeaussi :) mais il semble agir de manière plus similaire à celle que vous aviez auparavant. ps> up-vote la sedréponse montre la guérison dans la façon dont est fait.
Hastur
Oui, je suis conscient des problèmes de la solution d'origine, c'est pourquoi j'ai commencé à en chercher une meilleure. :-) Je voterais plus fort, mais mon nouveau compte a une réputation trop basse pour le faire.
Ren
0

Vous pouvez utiliser Vim en mode Ex:

ex -sc '1,-1000d|x' alert_migtst.log
  1. 1,-1000 sélectionner tout sauf les 1000 dernières lignes

  2. d effacer

  3. x sauver et fermer

Steven Penny
la source