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
, використовується для вилучення саме цього).