Bash 如何从文件中删除除最后10行以外的所有行?

Bash 如何从文件中删除除最后10行以外的所有行?,bash,sed,tail,Bash,Sed,Tail,用一个简单的shell命令是否可以只保留一行中的最后10行 tail -n 10 test.log 提供正确的结果,但我不知道如何修改test.log本身。及 tail -n 10 test.log > test.log 不工作。您可以使用tempfile来完成 tail -n 10 test.log > test1.log mv test1.log test.log 调用ed命令(文本编辑器): echo-e'1,-10d\nwq'ed 这将发送命令删除行('1,-10d

用一个简单的shell命令是否可以只保留一行中的最后10行

tail -n 10 test.log
提供正确的结果,但我不知道如何修改test.log本身。及

tail -n 10 test.log > test.log

不工作。

您可以使用tempfile来完成

tail -n 10 test.log > test1.log

mv test1.log test.log
调用ed命令(文本编辑器):

echo-e'1,-10d\nwq'ed
这将发送命令删除行('1,-10d')、保存文件('w')和退出('q')

还要注意,当输入文件少于11行时,ed失败(返回代码为1)

编辑:您也可以使用vi编辑器(或ex命令):

vi-+'1,-10d|wq'

但如果输入文件的行数不超过10行,vi编辑器将保持打开状态,您必须键入“:q”退出(或使用ex命令键入“q”)。

还可以使用变量:

LOG=$(tail -n 10 test.log)
echo "$LOG" > test.log

引语很重要。它们保留换行符。

根据经验,永远不要将文件同时用作输入和输出,你永远不知道它会如何结束。好建议。我刚刚做了
tail-n10test.log>test.log
,结果什么都没有(一个空白文件)。这很有效,谢谢。但是,不要忘记
1
,因为我做了
tail-n10 test.log>test.log
,留下了一个空白文件!奇怪的是,没有看到这个答案更受欢迎。它很优雅,而且在BSD上也能完成这项工作,而不仅仅是在Linux上。谢谢
vi - +'1,-10d|wq' <filename>
ruby -e 'a=File.readlines("file");puts a[-10..-1].join' > newfile
LOG=$(tail -n 10 test.log)
echo "$LOG" > test.log
echo "$(tail -n 10 test.log)" > test.log