Я пытался sed
заменить некоторые ключевые слова в большом файле (100 МБ). Я не знал о опции -i
(inplace), поэтому моей первой попыткой было перенаправление следующим образом:
sed 's/original/edited/g' file.log >> file.log
после этого произошло то, что мой компьютер остановился, почти без ввода с клавиатуры. Я попробовал другую консоль Ctrl kbd> + Alt kbd> + F1 kbd>, но после медленного ввода имени пользователя он тоже остановился. Без клавиатуры мой единственный вариант состоял в аппаратной перезагрузке машины. После входа я увидел, что file.log был около 8 ГБ.
Я действительно хотел бы понять, почему выполнение этой команды могло сделать систему настолько безразличной, и если на системном уровне существуют механизмы для запуска предупреждений и прекращения процесса, вызывающего сбой?
Как был уже сказан, >>
добавляет в файл, таким образом, Ваш sed
команда будет находиться, там читая строки, это только что произвело, и затем вывод их еще немного. Если бы Вы хотели заменить свой оперативный файл, [то 113] все еще не работал бы, но Вы знаете sed
-i
опция, которая является определенно той, которую Вы хотите.
, Если, однако, Вы абсолютно уверены, что хотите добавить в файл, который Вы читаете как поток и только хотите сделать одну передачу этого, рассмотреть использование sponge
от moreutils
пакет;
sed 's/original/edited/g' file.log | sponge >> file.log
sponge
чтения от stdin в память до EOF, затем выводит все его содержание к stdout, таким образом sed
поразит конец файла, прекратите читать его, закройте его и затем мойте губкой, начнет добавлять к нему.
Ваш sed
команда пыталась считать файл, к которому она добавляла. Это никогда не будет достигать Конца Файла, но съест много процессорного времени, пробуя. Вот почему ^C (прерывают текущий процесс) был изобретен.
gdmsetup
hasn' t вокруг с 2007. Код для его преемника, [111 лет], hasn' t измененный с 2010. На самом деле статья, которую Вы устно заключаете в кавычки, с 2007 и вряд ли будет полезна в 2018.
– Jos
1 February 2018 в 01:49
Добавление назад в файл, из которого Вы читаете, ни в коем случае не является хорошей идеей, поскольку Вы закончите с когда-либо растущим файлом. Если Вы действительно хотите записать обратно в файл, необходимо использовать эти -i
флаг:
sed -i 's/original/edited/g' file.log
или если Вы хотите, чтобы это создало резервное копирование прежде, чем сделать изменения, можно добавить суффикс файла к эти -i
флаг:
sed -i.bak 's/original/edited/g' file.log
Это создало бы файл, названный file.log.bak
и затем выполнение изменений, что Вы сделали там путем попытки добавить в файл, от которого Вы читаете, мы называем на сленге программиста гонку данных, где различные процессы мчатся для того же источника данных быть этим ввод или вывод. Это также, почему Ваша машина остановилась.
shopt -s nullglob
– muru 31 January 2018 в 22:58