J'essayais sed
de remplacer certains mots clés dans un gros fichier (100 Mo). Je n'étais pas au courant de l' -i
option (sur place), donc ma première tentative a été de rediriger comme ceci:
sed 's/original/edited/g' file.log >> file.log
ce qui s'est passé ensuite, c'est que mon PC s'est arrêté, presque pas de saisie clavier. J'ai essayé une autre console Ctrl+ Alt+ F1mais après avoir lentement entré le nom d'utilisateur, elle s'est également arrêtée. Sans clavier, ma seule option était de réinitialiser le matériel de la machine. Après la connexion, j'ai vu que file.log était d'environ 8 Go.
Je voudrais vraiment comprendre pourquoi l'exécution de cette commande a pu rendre le système si insensible, et si des mécanismes existent au niveau du système pour déclencher des alertes et tuer le processus incriminé?
la source
free -h
?ex -sc '%s/original/edited/ge|x' file.log
devrait faire ce que vous voulez d'une manière idiomatique UNIX sans lessed -i
effets secondaires.Réponses:
Comme cela a déjà été dit,
>>
s'ajoute au fichier, donc votresed
commande restera là à lire les lignes qu'elle vient de sortir, puis à les sortir un peu plus. Si vous vouliez remplacer votre fichier sur place,>
cela ne fonctionnerait toujours pas, mais vous connaissezsed
l'-i
option de, qui est certainement celle que vous souhaitez.Si, cependant, vous êtes absolument sûr de vouloir ajouter à un fichier que vous lisez en tant que flux, et que vous ne souhaitez effectuer qu'une seule opération, envisagez d'utiliser à
sponge
partir dumoreutils
package;sponge
lit de stdin dans la mémoire jusqu'à EOF, puis vide tout son contenu sur stdout, doncsed
frappera la fin du fichier, arrêtera de le lire, le fermera, puis l'éponge commencera à s'y ajouter.la source
sponge
est un utilitaire pratique pour savoir, maissed
a déjà une-i
possibilité:-i[SUFFIX], --in-place[=SUFFIX], edit files in place (makes backup if SUFFIX supplied)
.>>
ce qui ajoute plutôt que>
ce qui remplace. Certes, OP avait spécifiquement mentionné-i
dans le message et cela semble être un cas d'utilisation beaucoup plus courant que celui-ci, mais je pensais qu'il valait la peine de souligner que l'opération spécifique que OP avait publiée était possible sans trop de faille, si vous êtes vraiment c'est ce que vous voulez faire.sponge
, jetez un œil àvipe
.moreutils
est juste un paquet magique rempli de choses dont vous n'aviez jamaisVotre
sed
commande essayait de lire le fichier auquel elle était ajoutée. Il n'atteindra jamais la fin du fichier, mais consommera beaucoup de temps processeur à essayer. C'est pourquoi ^ C (interrompre le processus en cours) a été inventé.la source
Ajouter à nouveau le fichier que vous lisez n'est en aucun cas une bonne idée, car vous vous retrouverez avec un fichier en constante augmentation. Si vous voulez vraiment réécrire dans le fichier, vous devez utiliser l'
-i
indicateur:ou si vous souhaitez qu'il crée une sauvegarde avant d'effectuer des modifications, vous pouvez ajouter un suffixe de fichier à l'
-i
indicateur:Cela créerait un fichier appelé
file.log.bak
et apporterait ensuite des modifications, ce que vous avez fait en essayant d'ajouter au fichier que vous lisez, nous appelons le programmeur argot une course aux données, où différents processus se précipitent pour la même source de données, que ce soit en entrée ou en sortie . C'est aussi pourquoi votre machine s'est arrêtée.la source
"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 l'ensemble du processus de l'autre côté n'a pas reproduit le résultat et cela sur ma machine et sur la machine d'un autre utilisateur. Bien sûr, il existe un mécanisme avec lequel vous pouvez tuer les applications qui ne répondent pas, mais si votre machine ne répond plus, il ne vous reste qu'une seule option, la réinitialiser. Je suis toujours en train de tester cela et avant de ne pas comprendre complètement ce qui cause le comportement décrit, je ne peux pas répondre à cette partie de la question.sed
va tamponner le tout dans la mémoire puis le fermer, plutôt que de garder la poignée. Avec un fichier de ~ 100 Mo, comme dans OP, il a augmenté indéfiniment mais n'a pas brisé la machine.