使用 Bash 将文本文件的最后 n 行移到顶部

use*_*162 2 bash command sed

如何在不知道文件行数的情况下将文本文件的最后 n 行移动到顶部?是否可以使用单个命令行(sed例如)来实现这一点?

从:

...
a
b
c
d
Run Code Online (Sandbox Code Playgroud)

到:

a
b
c
d
...
Run Code Online (Sandbox Code Playgroud)

dib*_*ery 5

2020 年更新:

如果输入源来自管道,您可能会发现很难。在这种情况下,您可以使用

awk '{a[NR-1]=$0}END{for(i=0;i<NR;++i)print(a[(i-4+NR)%NR])}'
Run Code Online (Sandbox Code Playgroud)

这会将所有行存储在内存中(这可能是一个问题),然后输出它们。更改4命令以查看不同的结果。


显示最后 n 行,然后显示其余的行:

tail -n 4 file; head -n -4 file
Run Code Online (Sandbox Code Playgroud)

来自man head

-n, --lines=[-]NUM

打印前 NUM 行而不是前 10 行;使用前导“-”,打印每个文件的最后 NUM 行以外的所有行

tail -n 4 将显示文件的最后 4 行。

如果你想通过管道传输这些数据,你需要像这样把它们放在一起:

( tail -n 4 file; head -n -4 file ) | wc
Run Code Online (Sandbox Code Playgroud)

或者您可以使用 vim 内联编辑文件:

vim +'$-3,$m0' +'wq' file
Run Code Online (Sandbox Code Playgroud)

+Vim的选项将运行(防爆)命令跟随它。$-3,$m0表示在最后一行和最后一行之间的 3 行之间移动行到文件的开头。请注意,+和命令之间不应有空格。


或者在 vim 正常模式下使用命令:

vim +'norm G3kdGggPZZ' file
Run Code Online (Sandbox Code Playgroud)

G转到文件末尾;3k向上移动 3 行;dG删除到文件尾;gg转到文件顶部;P在此行之前粘贴已删除的行;ZZ保存并退出。