Я пытался sed
заменить некоторые ключевые слова в большом файле (100 МБ). Я не знал о -i
опции (inplace), поэтому моей первой попыткой было перенаправление следующим образом:
sed 's/original/edited/g' file.log >> file.log
после этого мой компьютер остановился, почти не было ввода с клавиатуры. Я попробовал другую консоль Ctrl+ Alt+ , F1но после того, как медленно ввод имени пользователя, он остановился тоже. Без клавиатуры мой единственный вариант состоял в аппаратной перезагрузке машины. После входа в систему я увидел, что file.log был около 8 ГБ.
Я действительно хотел бы понять, почему выполнение этой команды могло сделать систему настолько безразличной, и если на системном уровне существуют механизмы для запуска предупреждений и прекращения процесса, вызывающего нарушение?
command-line
sed
cesarpachon
источник
источник
free -h
?ex -sc '%s/original/edited/ge|x' file.log
следует делать то, что вы хотите в UNIX идиоматическим образом безsed -i
побочных эффектов.Ответы:
Как уже было сказано, он
>>
добавляется в файл, поэтому вашаsed
команда будет сидеть там, читая только что выведенные строки, а затем выводить их еще. Если вы хотите , чтобы заменить файл на месте,>
все еще не будет работать, но вы знаете оsed
«S-i
вариант, который, безусловно , тот , который вы хотите.Однако, если вы абсолютно уверены, что хотите добавить файл, который вы читаете, в виде потока, и хотите сделать только один проход, рассмотрите возможность использования
sponge
изmoreutils
пакета;sponge
читает из stdin в память до EOF, затем выводит все его содержимое в stdout, поэтомуsed
он достигнет конца файла, прекратит чтение, закроет его, а затем к нему добавится губка.источник
sponge
это хорошая утилита знать, ноsed
уже есть-i
вариант:-i[SUFFIX], --in-place[=SUFFIX], edit files in place (makes backup if SUFFIX supplied)
.>>
, который добавляет, а не>
заменяет. Конечно, OP специально упомянул-i
в этом посте, и это похоже на гораздо более распространенный вариант использования, чем этот, но я подумал, что стоит отметить, что опубликованная OP операция была возможна без особых ошибок, если вы действительно конечно, это то, что вы хотите сделать.sponge
, посмотрите наvipe
.moreutils
это просто волшебный пакет, наполненный вещами, которые вы никогда не знали, что вам нужноВаша
sed
команда пыталась прочитать файл, к которому она добавлялась. Он никогда не достигнет конца файла, но потратит много времени процессора. Вот почему ^ C (процесс прерывания тока) был изобретен.источник
Добавление обратно к файлу, из которого вы читаете, ни в коем случае не является хорошей идеей, поскольку в результате вы получите постоянно растущий файл. Если вы действительно хотите записать обратно в файл, вы должны использовать
-i
флаг:или если вы хотите создать резервную копию перед внесением изменений, вы можете добавить суффикс файла к
-i
флагу:Это создаст файл с именем
file.log.bak
и затем внесет изменения, то, что вы сделали там, пытаясь добавить к файлу, из которого вы читаете, мы называем программистом сленг гонкой данных, где разные процессы стремятся к одному и тому же источнику данных, будь то ввод или вывод , По этой же причине ваша машина остановилась.источник
"I really would like to understand why the execution of that command was able to make the system so unresponsive, and if mechanisms exist at the system level to trigger alerts and kill the offending process?"
strace
Всего процесс на другой сторону didtn воспроизвести результат и это на моей машине и на машине другого пользователя. Конечно, есть механизм, с помощью которого вы можете убивать неотвечающие приложения, но если ваша машина перестает отвечать на запросы, у вас остается только одна опция, сбрасывающая ее. Я все еще проверяю это, и, прежде чем я не до конца понимаю, что является причиной описанного поведения, я не могу ответить на эту часть вопроса.sed
буферизует всю вещь в памяти и затем закрывает ее, вместо того, чтобы держать ручку. С файлом ~ 100 МБ, как в OP, он рос бесконечно, но никак не влиял на компьютер.