Подход 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
превышает 100kB, делайте ...» (ls -lk
перечисляет размер файла в килобайтах в позиции 5, следовательно, awk
используется для извлечения именно этого).