Debido a un error de aplicación aún no diagnosticado, tengo varios cientos de servidores con un disco lleno. Hay un archivo que se ha llenado con líneas duplicadas, no un archivo de registro, sino un archivo de entorno de usuario con definiciones variables (por lo que no puedo eliminar el archivo).
Escribí un sed
comando simple para verificar las líneas agregadas erróneamente y eliminarlas, y lo probé en una copia local del archivo. Funcionó según lo previsto.
Sin embargo, cuando lo probé en el servidor con el disco lleno, recibí aproximadamente el siguiente error (es de memoria, no copiar y pegar):
sed: couldn't flush /path/to/file/sed8923ABC: No space left on deviceServerHostname
Por supuesto, sé que no queda espacio. ¡Es por eso que estoy tratando de eliminar cosas! (El sed
comando que estoy usando reducirá un archivo de más de 4000 líneas a aproximadamente 90 líneas).
Mi sed
comando es solosed -i '/myregex/d' /path/to/file/filename
¿Hay alguna manera de aplicar este comando a pesar del disco lleno?
(Debe ser automatizado, ya que necesito aplicarlo a varios cientos de servidores como una solución rápida).
(Obviamente, el error de la aplicación debe diagnosticarse, pero mientras tanto los servidores no funcionan correctamente ...)
Actualización: La situación que enfrenté se resolvió eliminando algo más que descubrí que podía eliminar, pero todavía me gustaría la respuesta a esta pregunta, que sería útil en el futuro y para otras personas.
/tmp
es un no-go; Está en el mismo sistema de archivos.
Antes de liberar espacio en el disco, probé y descubrí que podía eliminar las líneas vi
abriendo el archivo y ejecutándolo :g/myregex/d
y luego guardando los cambios con éxito :wq
. Parece que debería ser posible automatizar esto, sin recurrir a un sistema de archivos separado para contener un archivo temporal ... (?)
sed -i
crea una copia temporal para operar. Sospecho que ed
sería mejor para esto, aunque no estoy lo suficientemente familiarizado para proscribir una solución real
ed
ejecución: printf %s\\n g/myregex/d w q | ed -s infile
pero tenga en cuenta que algunas implementaciones también usan archivos temporales como sed
(puede probar busybox ed - afaik no crea un archivo temporal)
echo
. uso printf
. y sed
agregue algunos caracteres que suelte en la última línea para evitar perder espacios en blanco finales. Además, su shell debe ser capaz de manejar todo el archivo en una sola línea de comandos. ese es su riesgo, pruebe primero. bash
es especialmente malo en eso (creo que es hacer w / espacio de pila?) y puede enfermarte en cualquier momento. los dos sed
'si recomendados al menos usarían el buffer de tubería del núcleo para un buen efecto entre ellos, pero el método es bastante similar. su subcomando comando también se truncará file
si el w / in sed es exitoso o no.
sed '/regex/!H;$!d;x' <file|{ read v && cat >file;}
y, si funciona, lee el resto de mi respuesta.