Eu estava tentando sed
substituir algumas palavras-chave em um arquivo grande (100 MB). Como eu não conhecia a -i
opção (no local), minha primeira tentativa foi redirecionar assim:
sed 's/original/edited/g' file.log >> file.log
o que aconteceu depois disso foi que meu PC parou, quase sem entrada de teclado. Tentei um console diferente Ctrl+ Alt+, F1mas depois de inserir lentamente o nome do usuário, ele também parou. Sem teclado, minha única opção era redefinir o hardware da máquina. Após o login, vi que o file.log tinha cerca de 8 GB.
Eu realmente gostaria de entender por que a execução desse comando foi capaz de deixar o sistema sem resposta e se existem mecanismos no nível do sistema para acionar alertas e interromper o processo ofensivo?
command-line
sed
cesarpachon
fonte
fonte
free -h
?ex -sc '%s/original/edited/ge|x' file.log
deve fazer o que quiser da maneira idiomática do UNIX, sem ossed -i
efeitos colaterais.Respostas:
Como já foi dito,
>>
anexa ao arquivo, portanto, seused
comando fica sentado lendo as linhas que acabou de produzir e, em seguida, produzindo-as um pouco mais. Se você quiser substituir o arquivo no local,>
ainda não iria funcionar, mas você está cientesed
da-i
opção, que é definitivamente o que você quer.Se, no entanto, você tiver certeza absoluta de que deseja anexar a um arquivo que está lendo como fluxo, e deseja fazer apenas uma passagem, considere usar
sponge
omoreutils
pacote;sponge
lê de stdin na memória até o EOF, depois despeja todo o seu conteúdo no stdout, parased
atingir o final do arquivo, parar de ler, fechá-lo e a esponja começará a anexá-lo.fonte
sponge
é um utilitário agradável de saber sobre, massed
já tem uma-i
opção:-i[SUFFIX], --in-place[=SUFFIX], edit files in place (makes backup if SUFFIX supplied)
.>>
, o que acrescenta, e não o>
que substitui. É verdade que o OP havia mencionado especificamente-i
no post e parece ser um caso de uso muito mais comum do que este, mas achei que valia a pena ressaltar que a operação específica que o OP havia postado era possível sem muita folga, se você realmente com certeza é o que você quer fazer.sponge
, dê uma olhadavipe
.moreutils
é apenas um pacote mágico cheio de coisas que você nunca soube que precisavaSeu
sed
comando estava tentando ler o arquivo ao qual estava anexando. Ele nunca chegará ao fim do arquivo, mas consumirá muito tempo da CPU tentando. É por isso que ^ C (interromper o processo atual) foi inventado.fonte
Anexar novamente ao arquivo do qual você lê não é, de forma alguma, uma boa idéia, pois você terminará com um arquivo cada vez maior. Se você realmente deseja gravar novamente no arquivo, use o
-i
sinalizador:ou se você desejar criar um backup antes de fazer alterações, poderá adicionar um sufixo de arquivo ao
-i
sinalizador:Isso criaria um arquivo chamado
file.log.bak
e, em seguida, faria alterações. O que você fez lá ao tentar anexar ao arquivo do qual está lendo, chamamos na gíria do programador uma corrida de dados, onde diferentes processos disputam a mesma fonte de dados, seja de entrada ou saída . É também por isso que sua máquina parou.fonte
"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
de todo o processo do outro lado didtn reproduzir o resultado e isso na minha máquina e na máquina de um outro usuário. Certamente, existem mecanismos com os quais você pode eliminar aplicativos que não respondem, mas se sua máquina é deixada sem resposta, você fica com apenas uma opção, redefinindo-a. Ainda estou testando isso e, antes de não entender completamente o que está causando o comportamento descrito, não consigo resolver esta parte da pergunta.sed
, a memória inteira seja armazenada em buffer e depois fechá-la, em vez de manter o controle. Com um arquivo de ~ 100 MB, como no OP, ele cresceu indefinidamente, mas não afetou a máquina.