Как я могу удалить все, кроме последних 10 строк из файла?

Можно ли сохранить только последние 10 строк строки с помощью простой команды оболочки?

tail -n 10 test.log

дает правильный результат, но я не знаю, как изменить сам test.log. А также

tail -n 10 test.log > test.log

не работает

6 ответов

Вы можете сделать это, используя временный файл.

tail -n 10 test.log > test1.log

mv test1.log test.log
echo "$(tail -n 10 test.log)" > test.log

Цитаты важны. Они сохраняют символы новой строки.

Вызвать команду ed (текстовый редактор):

 echo -e '1,-10d\nwq' | ed <filename>

Это отправит команду на удаление строк ('1,-10d'), сохранение файла ('w') и выход ('q').

Также обратите внимание, что ed завершается неудачно (код возврата равен 1), когда входной файл содержит менее 11 строк.

Редактировать: Вы также можете использовать редактор vi (или команду ex):

vi - +'1,-10d|wq' <filename>

Но если во входном файле 10 или менее строк, редактор vi останется открытым, и вы должны набрать ':q' для выхода (или 'q' с командой ex).

Также вы можете использовать переменную:

LOG=$(tail -n 10 test.log)
echo "$LOG" > test.log
ruby -e 'a=File.readlines("file");puts a[-10..-1].join' > newfile

Я знаю, что это устарело, но я хотел продемонстрировать, как здесь может помочь замена процессов:

      cp <(tail -n 10 test.log) test.log

Поскольку замена процесса приводит к созданию временного файла, он не перезаписывается.test.logслишком рано. Это в отличие от попытки в вопросе.

Другие вопросы по тегам