sed
Подход хорошо, но в цикле по всем линиям не является. Если вы знаете, сколько строк вы хотите сохранить (для примера, я использую здесь 99), вы можете сделать это следующим образом:
sed -i '100,$ d' myfile.txt
Пояснение: sed
это процессор регулярных выражений. С указанным параметром -i
он обрабатывает файл напрямую («inline»), а не просто читает его и записывает результаты в стандартный вывод. 100,$
просто означает «от строки 100 до конца файла» - и сопровождается командой d
, которую вы, вероятно, догадались правильно, чтобы заменить «удалить». Короче говоря, команда означает: «Удалить все строки из строки 100 до конца файла из myfile.txt». 100 - это первая строка, которую нужно удалить, так как вы хотите сохранить 99 строк.
Изменить: Если, с другой стороны, есть файлы журналов, где вы хотите сохранить, например, последние 100 строк:
[ $(wc -l myfile.txt) -gt 100 ] && sed -i "1,$(($(wc -l myfile.txt|awk '{print $1}') - 100)) d" myfile.txt
Что здесь происходит:
[ $(wc -l myfile.txt) -gt 100 ]
: делать следующее, только если файл содержит более 100 строк
$((100 - $(wc -l myfile.txt|awk '{print $1}')))
: вычислить количество удаляемых строк (т.е. сохранить все строки файла, кроме (последних) 100)
1, $((..)) d
: удалить все строки от первой до расчетной
РЕДАКТИРОВАТЬ: так как вопрос был только что отредактирован, чтобы дать больше деталей, я включу эту дополнительную информацию вместе с моим ответом. Добавлены факты:
- конкретный размер должен оставаться в файле (10 000 байт)
- каждая строка имеет определенный размер в байтах (300 байтов в примере)
Из этих данных можно рассчитать количество строк, которые останутся как "/", что в примере будет означать 33 строки. Термин оболочки для вычисления: $((size_to_remain / linesize))
(по крайней мере в Linux, использующем Bash, результат - целое число). Настроенная команда теперь будет выглядеть так:
# keep the start of the file (OPs question)
sed -i '34,$ d' myfile.txt
# keep the end of the file (my second example)
[ $(wc -l myfile.txt) -gt 33 ] && sed -i "1,33 d" myfile.txt
Поскольку размеры известны заранее, больше нет необходимости в вычислениях, встроенных в sed
команду. Но для большей гибкости внутри некоторого сценария оболочки можно использовать переменные.
Для условной обработки, основанной на размере файла, можно использовать следующую «тестовую» конструкцию:
[ "$(ls -lk $file | awk ' {print $5}')" -gt 100 ] &&
что означает: «если размер $file
превышает 100 КБ, делайте ...» ( ls -lk
перечисляет размер файла в КБ в позиции 5, следовательно awk
, используется для извлечения именно этого).