sedПідхід добре, але в циклі по всіх лініях не є. Якщо ви знаєте, скільки рядків ви хочете зберегти (для прикладу, я тут використовую 99), ви можете зробити це так:
sed -i '100,$ d' myfile.txt
Пояснення: sedце звичайний процесор вираження. З -iнаданою опцією , він обробляє файл безпосередньо ("вбудований") - замість того, щоб просто його читати і записувати результати на стандартний вихід. 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: видаліть усі рядки від першого до обчисленого рядка
EDIT: оскільки питання було щойно відредаговане, щоб дати більше деталей, я включу цю додаткову інформацію разом із моєю відповіддю. Додані факти:
- певний розмір повинен залишатися у файлі (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команду. Але для гнучкості всередині сценарію оболонки можна використовувати змінні.
Для умовної обробки, що базується на розмірі файлу, можна використовувати наступний "test" -konstruct:
[ "$(ls -lk $file | awk ' {print $5}')" -gt 100 ] &&
що означає: "якщо розмір $fileперевищує 100 кБ, зробіть ..." ( ls -lkперераховує розмір файлу в кБ у позиції 5, отже awk, використовується для вилучення саме цього).