命令行“缓冲区”

命令行“缓冲区”

我想将tail文件的最后 100 行写入同一个文件,但该命令 tail -n 100 file > file不起作用,我假设是因为在从原始文件读取所有内容之前,标准输出已写入“实时”文件。

有什么方法可以将输出传送到某物,然后保存它直到所有 100 行都存在,然后将其输出到文件?或者只是以这种方式缩短文件的另一种方法?

答案1

sponge更多实用程序对此有好处。它会:

吸收标准输入并写入文件

你像这样使用它:

tail -n 100 file | sponge file

以获得您想要的效果。

答案2

当然,当我最终在SE上问这个问题的那一刻,答案就出现了。我认为 less 可以满足我的需要,所以我只写:

tail -n 100 file | less > file

答案3

在:

tail -n 100 file > file

shell 分叉一个进程,打开file并在其中写入,并进行截断(使其成为空文件),然后tail在该进程中执行。要打开file而不截断,您可以使用<>重定向运算符:

tail -n 100 file 1<> file

但问题是根本不会有任何截断。也就是说,file将被最后 100 行覆盖,但在这些100行之后,文件中最初的内容仍然存在。因此,您需要在tail完成后调用另一个命令来进行截断。

{ tail -n 100 file; perl -e 'truncate STDOUT, tell STDOUT'; } 1<> file

答案4

你可以这样做:

printf '%s\n' "$(tail -n 100 file)" > file

相关内容