Estaba tratando sed
de reemplazar algunas palabras clave en un archivo grande (100 MB). No tenía conocimiento de la -i
opción (in situ), así que mi primer intento fue redirigir así:
sed 's/original/edited/g' file.log >> file.log
Lo que sucedió después de eso fue que mi PC se detuvo, casi sin entrada de teclado. Probé una consola diferente Ctrl+ Alt+ F1pero después de ingresar lentamente el nombre de usuario, también se detuvo. Sin teclado, mi única opción era restablecer el hardware de la máquina. Después de iniciar sesión, vi que file.log tenía unos 8 GB.
Realmente me gustaría entender por qué la ejecución de ese comando pudo hacer que el sistema no respondiera tanto, y si existen mecanismos a nivel del sistema para activar alertas y matar el proceso ofensivo.
command-line
sed
cesarpachon
fuente
fuente
free -h
?ex -sc '%s/original/edited/ge|x' file.log
debe hacer lo que quiera de forma idiomática UNIX sin lossed -i
efectos secundarios.Respuestas:
Como ya se ha dicho, se
>>
agrega al archivo, por lo que sused
comando se quedará allí leyendo las líneas que acaba de emitir y luego emitiéndolas un poco más. Si quisiera reemplazar su archivo en el lugar,>
todavía no funcionaría, pero conocesed
la-i
opción, que definitivamente es la que desea.Sin embargo, si está absolutamente seguro de que desea agregar a un archivo que está leyendo como una secuencia, y solo desea hacer una pasada, considere usarlo
sponge
desde elmoreutils
paquete;sponge
lee desde stdin en la memoria hasta EOF, luego volca todo su contenido en stdout, porsed
lo que llegará al final del archivo, dejará de leerlo, lo cerrará y luego la esponja comenzará a agregarse a él.fuente
sponge
es una buena utilidad para conocer, perosed
ya tiene una-i
opción:-i[SUFFIX], --in-place[=SUFFIX], edit files in place (makes backup if SUFFIX supplied)
.>>
, que agrega, en lugar de>
, que reemplaza. De acuerdo, OP había mencionado específicamente-i
en la publicación y parece un caso de uso mucho más común que este, pero pensé que valía la pena señalar que la operación específica que OP había publicado era posible sin demasiadas fallas, si realmente Seguro que es lo que quieres hacer.sponge
, échale un vistazovipe
.moreutils
es sólo un paquete mágico lleno de cosas que no sabías que necesitabasSu
sed
comando intentaba leer el archivo al que se estaba agregando. Nunca llegará al final del archivo, pero consumirá mucho tiempo de CPU en el intento. Es por eso que se inventó ^ C (interrumpir el proceso actual).fuente
Volver a agregar al archivo que leyó no es en ningún caso una buena idea, ya que terminará con un archivo cada vez mayor. Si realmente desea volver a escribir en el archivo, debe usar la
-i
bandera:o si desea que cree una copia de seguridad antes de hacer cambios, puede agregar un sufijo de archivo al
-i
indicador:Esto crearía un archivo llamado
file.log.bak
y luego haciendo cambios, lo que hiciste al intentar agregar al archivo que estás leyendo llamamos en la jerga del programador una carrera de datos, donde diferentes procesos compiten por la misma fuente de datos ya sea de entrada o salida . Esta es también la razón por la cual su máquina se detuvo.fuente
"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
del proceso completo en el otro lado no reprodujo el resultado y esto en mi máquina y en la máquina de otro usuario. Claro que hay un mecanismo con el que puede eliminar aplicaciones que no responden, pero si su máquina deja de responder, solo le queda una opción, reiniciarla. Todavía estoy probando esto y antes de no entender completamente qué está causando el comportamiento descrito, no puedo abordar esta parte de la pregunta.sed
almacenará todo en la memoria y luego lo cerrará, en lugar de mantener el control. Con un archivo de ~ 100 MB, como en OP, creció indefinidamente pero no bloqueó la máquina.