Из-за ошибки приложения, которая еще не диагностирована, у меня есть несколько сотен серверов с полным диском. Есть один файл, который был заполнен дублирующимися строками - не файл журнала, а файл пользовательской среды с определениями переменных (поэтому я не могу просто удалить этот файл).
Я написал простую 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(вы можете попробовать busybox ed - afaik, он не создает временный файл)
echo. использовать printf. и sedдобавьте несколько символов, которые вы уронили в последнюю строку, чтобы избежать потери пробелов. Кроме того, ваша оболочка должна иметь возможность обрабатывать весь файл в одной командной строке. это твой риск - сначала проверь. bashособенно плохо в этом (я думаю, что это делать с пространством стека?) и может надоесть вам в любое время. два sedрекомендованных si будут по крайней мере использовать буфер канала ядра для хорошего эффекта между ними, но метод довольно похож. ваша команда sub будет также усекать file, успешно ли sed w / in.
sed '/regex/!H;$!d;x' <file|{ read v && cat >file;}и если это сработает, прочитайте остаток моего ответа.