Через помилку програми, яка ще не діагностована, у мене є кілька сотень серверів з повним диском. Є один файл, який був заповнений повторюваними рядками - не файл журналу, а файл середовища користувача зі змінними визначеннями (тому я не можу просто видалити файл).
Я написав просту 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;}
і якщо це працює, прочитайте решту моєї відповіді. "