【发布时间】:2017-05-10 06:14:52
【问题描述】:
我正在跟踪一个文件。我想在跟踪文件时从文件中删除行。我想避免覆盖文件(截断)并且我想避免用新文件替换文件,因为这很可能会弄乱/破坏 tail 命令结果。
目前我尝试了两种不同的方法:
读取文件的全部内容,删除不需要的数据行,然后用比以前更少的数据写回文件。这会导致从 tail 命令喷出一些 stderr =>
"file was truncated"...tail -F仍在工作,但它确实记录了这个 stderr。使用
sed -i '/pattern/d' my-file.txt从文件中删除我不再需要的行。这会导致从 tail 命令喷出一些 stderr =>"file was replaced"(注意与上面不同)...tail -F仍在工作,但它确实记录了这个 stderr。
我想知道是否有一种方法可以在不截断文件或替换文件的情况下从文件中删除行,因为这似乎让 tail 的生活比其他方式更难。
我应该忽略这个标准错误吗?如果我只是忽略标准错误,我认为尾部结果将不准确。我需要尽可能准确的尾部结果,因为它们正在输入一个新程序,而不是被人类读取。
【问题讨论】:
-
有没有考虑重定向
stderr,也就是tail -F path 2>/dev/null? -
我认为不可能就地编辑文件。
-
好吧 sed -i 是 sed --in-place,这似乎背叛了文件实际上被新文件替换的事实,相当蹩脚的 IMO
-
您真的需要编辑文件还是在拖尾时看不到“坏行”就足够了?
-
@andreas,多个进程将拖尾此单个文件,因此此文件需要是唯一且最终的事实来源。最好只删除行然后修改行并以某种方式将它们标记为“已删除”。如果您不删除行,则文件之夜会变得太大。