sed eliminando saltos de línea cola

sed eliminando saltos de línea cola

En mi script de Python necesitaba una forma rápida y eficiente de establecer un tamaño de archivo máximo en un archivo en el que escribo constantemente. En lugar de llevar todo a la RAM de py, ejecuté este comando de shell:

sed -i '1d' file.csv

Superviso el tamaño del archivo periódicamente y ejecuto el comando según sea necesario. El problema es que ahora si I tail -f file.csv, tail deja de seguir el archivo tan pronto como sed elimina una línea. ¿Alguna solución?

Respuesta1

El problema básico es sedcrear un nuevo archivo. Esto se muestra en el siguiente extracto:

$ strace -fe trace=file,read,write,close sed -i '1d'  /tmp/x.csv 
....
openat(AT_FDCWD, "/tmp/x.csv", O_RDONLY) = 3
...
openat(AT_FDCWD, "/tmp/sed1nFxY1", O_RDWR|O_CREAT|O_EXCL, 0600) = 4
write(5, NULL, 0)                       = 0
read(3, "1,1,1,1\n2,2,2,2\n3,3,3,3\n", 4096) = 24
write(4, "2,2,2,2\n", 8)                = 8
write(4, "3,3,3,3\n", 8)                = 8
read(3, "", 4096)                       = 0
close(3)                                = 0
close(4)                                = 0
rename("/tmp/sed1nFxY1", "/tmp/x.csv")  = 0
close(1)                                = 0
close(2)                                = 0

Hasta donde yo sé, no existe una manera fácil de truncar el inicio de un archivo.

Sugeriría que su aplicación Python escuche en un socket Unix/tcp y, una vez aceptada, coloque esa transmisión en elmarco de registroy luego utilícelo nc ... | tailpara ver la salida.

Respuesta2

Michael Hamptonsugiere lo obvio tail -F, pero personalmente uso principalmente lesshoy en día:

less --follow-name +F file.csv

Al no haber una alternativa abreviada a --follow-name, tengo que usar un alias:

alias less='less --follow-name -XFR'

información relacionada