Как я могу удалить все, кроме последних 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
слишком рано. Это в отличие от попытки в вопросе.