2010-09-23 3 views
11

Возможно ли сохранить только последние 10 строк строк с помощью простой команды оболочки?Как удалить все, кроме последних 10 строк из файла?

tail -n 10 test.log 

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

tail -n 10 test.log > test.log 

не работает.

+3

как правило, никогда не используйте файл одновременно в качестве входа и выхода, вы никогда не знаете, как это закончится. – tokland

+0

Хороший совет. Я просто сделал 'tail -n 10 test.log> test.log' и ничего не получил (пустой файл). – sam

ответ

16

Вы можете сделать это, используя tempfile.

tail -n 10 test.log > test1.log 

mv test1.log test.log 
+0

Это работает, спасибо. Однако ** не забывайте '1' **, потому что я сделал' tail -n 10 test.log> test.log' и остался с пустым файлом! – sam

1

Invoke эд команды (текстовый редактор):

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

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

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

Edit: Вы также можете использовать редактор VI (или бывшую команду):

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

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

1

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

LOG=$(tail -n 10 test.log) 
echo "$LOG" > test.log 
8
echo "$(tail -n 10 test.log)" > test.log 

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