Через помилку програми, яка ще не діагностована, у мене є кілька сотень серверів з повним диском. Є один файл, який був заповнений повторюваними рядками - не файл журналу, а файл середовища користувача зі змінними визначеннями (тому я не можу просто видалити файл).
Я написав просту sedкоманду, щоб перевірити наявність помилково доданих рядків та видалити їх, і перевірив її на локальній копії файлу. Це працювало за призначенням.
Однак, коли я спробував це на сервері з повним диском, я отримав приблизно таку помилку (це з пам’яті, а не копіювання та вставки):
sed: couldn't flush /path/to/file/sed8923ABC: No space left on deviceServerHostname
Звичайно, я знаю, що місця не залишилось. Ось чому я намагаюся видалити речі! ( sedКоманда, яку я використовую, зменшить файл рядка 4000+ приблизно до 90 рядків.)
Моя sedкоманда справедливаsed -i '/myregex/d' /path/to/file/filename
Чи є спосіб я застосувати цю команду, незважаючи на повний диск?
(Він повинен бути автоматизованим, оскільки мені потрібно застосувати його до декількох сотень серверів як швидке виправлення.)
(Очевидно, помилку програми потрібно діагностувати, але тим часом сервери працюють не правильно ....)
Оновлення: Ситуацію, з якою я стикався, було вирішено, видаливши щось інше, що я виявив, що можу видалити, але все одно хотів би відповісти на це запитання, яке було б корисно в майбутньому та для інших людей.
/tmp- не-ходити; це в одній файловій системі.
Перш ніж звільнити місце на диску, я перевірив і з’ясував, що я можу видалити рядки vi, відкривши файл і запустивши, :g/myregex/dа потім успішно зберегти зміни :wq. Здається, це має бути можливо автоматизувати, не вдаючись до окремої файлової системи, щоб вмістити тимчасовий файл .... (?)
sed -iстворює тимчасову копію для роботи. Я підозрюю, що edдля цього було б краще, хоча я недостатньо знайомий, щоб передбачити фактичне рішення
edвами запустили: printf %s\\n g/myregex/d w q | ed -s infileале майте на увазі, що деякі реалізації також використовують тимчасові файли так само sed(ви можете спробувати
echo. використання printf. і sedдодайте до останнього рядка якийсь шар, який ви скинете, щоб уникнути втрати проміжків. також ваша оболонка повинна вміти обробляти весь файл в одному командному рядку. це ваш ризик - спершу тестуйте. bashособливо погано в цьому (я думаю, це робити з / укладають простір?) і може захворіти на вас у будь-який час. два sedрекомендованих si принаймні використовувати буфер ядра труби для хорошого ефекту між ними, але метод досить схожий. ваша підкоманда команд також уріже, fileчи успіх sed w / in є.
sed '/regex/!H;$!d;x' <file|{ read v && cat >file;}і якщо це працює, прочитайте решту моєї відповіді. "