Из-за ошибки приложения, которая еще не диагностирована, у меня есть несколько сотен серверов с полным диском. Есть один файл, который был заполнен дублирующимися строками - не файл журнала, а файл пользовательской среды с определениями переменных (поэтому я не могу просто удалить этот файл).
Я написал простую 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;}
и если это сработает, прочитайте остаток моего ответа.