Почему перенаправление вывода sed в один и тот же входной файл приводит к тому, что мой компьютер не отвечает?

Я пытался sed заменить некоторые ключевые слова в большом файле (100 МБ). Я не знал о опции -i (inplace), поэтому моей первой попыткой было перенаправление следующим образом:

sed 's/original/edited/g' file.log >> file.log

после этого произошло то, что мой компьютер остановился, почти без ввода с клавиатуры. Я попробовал другую консоль Ctrl + Alt + F1 , но после медленного ввода имени пользователя он тоже остановился. Без клавиатуры мой единственный вариант состоял в аппаратной перезагрузке машины. После входа я увидел, что file.log был около 8 ГБ.

Я действительно хотел бы понять, почему выполнение этой команды могло сделать систему настолько безразличной, и если на системном уровне существуют механизмы для запуска предупреждений и прекращения процесса, вызывающего сбой?

13
задан 8 July 2016 в 06:46

3 ответа

Как был уже сказан, >> добавляет в файл, таким образом, Ваш sed команда будет находиться, там читая строки, это только что произвело, и затем вывод их еще немного. Если бы Вы хотели заменить свой оперативный файл, [то 113] все еще не работал бы, но Вы знаете sed -i опция, которая является определенно той, которую Вы хотите.

, Если, однако, Вы абсолютно уверены, что хотите добавить в файл, который Вы читаете как поток и только хотите сделать одну передачу этого, рассмотреть использование sponge от moreutils пакет;

sed 's/original/edited/g' file.log | sponge >> file.log

sponge чтения от stdin в память до EOF, затем выводит все его содержание к stdout, таким образом sed поразит конец файла, прекратите читать его, закройте его и затем мойте губкой, начнет добавлять к нему.

0
ответ дан 8 July 2016 в 06:46

Ваш sed команда пыталась считать файл, к которому она добавляла. Это никогда не будет достигать Конца Файла, но съест много процессорного времени, пробуя. Вот почему ^C (прерывают текущий процесс) был изобретен.

0
ответ дан 8 July 2016 в 06:46
  • 1
    Я думаю 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 и затем выполнение изменений, что Вы сделали там путем попытки добавить в файл, от которого Вы читаете, мы называем на сленге программиста гонку данных, где различные процессы мчатся для того же источника данных быть этим ввод или вывод. Это также, почему Ваша машина остановилась.

0
ответ дан 8 July 2016 в 06:46
  • 1
    конечно, сначала необходимо проверить ли " missing" функция (здесь: вывод цвета) isn' t уже представляют, но отключенный по умолчанию. – Jan Schejbal 31 January 2018 в 19:24

Другие вопросы по тегам:

Похожие вопросы: