尾部反转/打印除最后n行之外的所有内容?

Tos*_*ock 38 linux bash command-line

是否有(POSIX命令行)方式打印所有文件除了最后n行?用例是,我将有多个未知大小的文件,所有文件都包含一个已知大小的样板页脚,我想删除它.我想知道在自己编写之前是否已有一个实用程序可以执行此操作.

Ada*_*m B 42

head(1)的大多数版本 - 特别是派生的GNU,但不是BSD派生的 - 具有执行此操作的功能.如果您使用负数作为要打印的行数,它将显示除结尾之外的文件顶部.

像这样:

head -n -10 textfile
Run Code Online (Sandbox Code Playgroud)

  • 但是,在POSIX中,-n必须是正整数. (9认同)
  • 在Mac OS X中使用`ghead`(通过`brew install coreutils`安装) (6认同)
  • 对于严格的 POSIX 来说已经足够了。我应该更清楚我的“最”。如果你想要一个更快速和更脏的 POSIX 方法,我会假设 `wc -l` 加上一些数学运算会给你一个传递给 `head` 的值 (2认同)

use*_*645 14

可能效率低于"wc"+"做数学"+"尾巴"方法,但更容易看:

tail -r file.txt | tail +NUM | tail -r
Run Code Online (Sandbox Code Playgroud)

NUM一个比你要删除的结束行数多一个,例如+11将打印除最后10行之外的所有行.这适用于不支持head -n -NUM语法的BSD .


Con*_*ion 7

head实用程序是你的朋友.

从手册页head:

-n, --lines=[-]K
     print the first K lines instead of the first 10;
       with the leading `-', print all but the last K lines of each file
Run Code Online (Sandbox Code Playgroud)

  • 但是,在POSIX中,-n必须是正整数. (5认同)
  • 不幸的是,在BSD派生(即OSX)系统中,负值不是-n的有效参数 (5认同)

gei*_*rha 5

没有标准命令可以执行此操作,但是您可以使用awk或sed填充N行的缓冲区,并在缓冲区满后从头开始打印。例如,用awk:

awk -v n=5 '{if(NR>n) print a[NR%n]; a[NR%n]=$0}' file
Run Code Online (Sandbox Code Playgroud)