sed entfernt Zeilenumbrüche tail

sed entfernt Zeilenumbrüche tail

In meinem Python-Skript brauchte ich eine schnelle/effiziente Möglichkeit, eine maximale Dateigröße für eine Datei festzulegen, in die ich ständig schreibe. Anstatt das Ganze in den RAM von py zu bringen, habe ich diesen Shell-Befehl ausgeführt:

sed -i '1d' file.csv

Ich überwache die Dateigröße regelmäßig und führe den Befehl bei Bedarf aus. Das Problem ist, dass tail -f file.csvtail jetzt aufhört, die Datei zu tailen, sobald sed eine Zeile daraus entfernt. Irgendeine Lösung?

Antwort1

Das Grundproblem besteht darin, dass sedeine neue Datei erstellt wird. Dies wird durch den folgenden Auszug veranschaulicht:

$ 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

Es gibt, soweit ich weiß, keine einfache Möglichkeit, den Anfang einer Datei abzuschneiden.

Ich würde vorschlagen, Ihre Python-Anwendung so einzurichten, dass sie auf einem Unix/TCP-Socket lauscht, und diesen Stream nach der Annahme in denProtokollierungsframeworkund verwenden Sie dann, nc ... | tailum die Ausgabe anzusehen.

Antwort2

Michael Hamptonlegt das Offensichtliche nahe tail -F, aber ich persönlich verwende lessheutzutage meistens:

less --follow-name +F file.csv

Da es keine Kurzalternative zu gibt --follow-name, muss ich einen Alias ​​verwenden:

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

verwandte Informationen