sed removendo quebras de linha cauda

sed removendo quebras de linha cauda

No meu script Python, eu precisava de uma maneira rápida/eficiente de definir um tamanho máximo de arquivo em um arquivo no qual estou constantemente gravando. Em vez de trazer tudo para a RAM do py, executei este comando shell:

sed -i '1d' file.csv

Eu monitoro o tamanho do arquivo periodicamente e executo o comando conforme necessário. O problema é que agora, se I tail -f file.csv, tail para de seguir o arquivo assim que sed remove uma linha dele. Qualquer solução?

Responder1

O problema básico é sedcriar um novo arquivo. Isso é demonstrado pelo extrato abaixo:

$ 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

Até onde eu sei, não existe uma maneira fácil de truncar o início de um arquivo.

Eu sugiro que seu aplicativo python escute em um soquete unix/tcp e, uma vez aceito, coloque esse fluxo noestrutura de registroe use nc ... | tailpara observar a saída.

Responder2

Michael Hamptonsugere o óbvio tail -F, mas eu pessoalmente uso principalmente lesshoje em dia:

less --follow-name +F file.csv

Não havendo alternativa abreviada para --follow-name, tenho que usar um alias:

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

informação relacionada