sed は改行の末尾を削除します

sed は改行の末尾を削除します

私の Python スクリプトでは、常に書き込みを行っているファイルの最大ファイルサイズを高速かつ効率的に設定する方法が必要でした。すべてを py の RAM に取り込むのではなく、次のシェル コマンドを実行しました。

sed -i '1d' file.csv

私は定期的にファイルサイズを監視し、必要に応じてコマンドを実行します。問題は、tail -f file.csvsed がファイルから行を削除するとすぐに、 tail がファイルの追跡を停止することです。解決策はありますか?

答え1

基本的な問題は、sed新しいファイルを作成することです。これは以下の抜粋で示されています。

$ 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

私の知る限り、ファイルの先頭を切り捨てる簡単な方法はありません。

Pythonアプリケーションをunix/tcpソケットでリッスンするようにして、受け入れられたらそのストリームをロギングフレームワークそしてnc ... | tail出力を監視するために使用します。

答え2

マイケル・ハンプトン明らかなことを示唆していますtail -Fが、私は個人的にless最近主に以下を使用しています:

less --follow-name +F file.csv

の省略形がないので--follow-name、別名を使用する必要があります。

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

関連情報