3

Я ищу способ, как отказаться от содержимого файла журнала, оставив только определенный хвост. В два этапа это довольно просто:

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

Есть ли способ, как добиться того же с помощью одной команды, среди других причин, чтобы избежать возможной потери строк?

3 ответа3

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

Как обычно, попрактикуйтесь со всеми решениями, которые вы найдете, прежде чем использовать его для критически важных файлов.

0

Вы можете использовать Vim в режиме Ex:

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

  2. d удалить

  3. x сохранить и закрыть

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .