Відмовтеся від вмісту журналу, зберігаючи хвіст


3

Я шукаю спосіб, як відкинути вміст журналу, залишивши лише визначений хвіст. У два кроки це досить просто:

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

Чи існує спосіб, як досягти того ж за допомогою однієї команди, серед інших причин, щоб уникнути можливої ​​втрати рядків?

Відповіді:


2

Можна використовувати sed

sed -e :a -e '$q;N;1001,$D;ba' -i filename
  • -e визначає сценарій (команду)
  • :a визначає мітку
  • $qвизначає адресу ( $кінець файлу) та гілки qна неї
  • N додає наступний рядок вводу до простору шаблону
  • 1001,$dвидаляє весь рядок між 1001 та кінцем файлу (через попередній Nвони будуть додані до простору шаблону)
  • ba гілок до мітки, визначеної на початку

Наприклад (останні 3 рядки файлу)

$ 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

Чесно кажучи, я сподівався, що буде якийсь простий спосіб, як спеціальна команда, але, можливо, це не настільки звичне завдання, як я думав. Але це буде працювати без додаткових інструментів, дякую.
Рен

0

Ви можете спробувати використовувати губку, яку ви можете встановити разом з пакетом moreutils. Це дозволяє перенаправляти вихід на той самий файл (інакше ви його видаляєте).

   tail -n1000 alert_migtst.log | sponge alert_migtst.log

Як правило, практикуйте всі рішення, які ви знайдете, перш ніж використовувати його на критичних файлах.


Я не можу встановити додаткові пакети лише для одного завдання, тому я піду з sed. Все одно, дякую.
Ren

Ласкаво просимо. Не забудьте перевірити все, що можна, з запущеними файлами, тому що, наприклад, методом, який ви використовували, перш ніж ви зможете пропустити деякі рядки, якщо вони надруковані тим часом, ви копіюєте тимчасовий файл у новий. Я не знаю, як система може впоратися, sedякщо розмір змінюватиметься тим часом. Я також не знаю цього в деталях sponge:), але, здається, діяти більш схожим чином, як ви робили раніше. ps> під голосування sedвідповідь, це показує вилікування способом робиться.
Хастур

Так, я знаю проблеми оригінального рішення, тому я почав шукати кращого. :-) Я би голосував, але мій новий рахунок має занадто низьку репутацію для цього.
Ren

0

Ви можете використовувати Vim в режимі Ex:

ex -sc '1,-1000d|x' alert_migtst.log
  1. 1,-1000 виберіть усі, крім останніх 1000 рядків

  2. d видалити

  3. x зберегти і закрити

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.