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

是否有(POSIX命令行)的方式来打印所有的文件,除了最后n行? 使用情况是,我将有多个未知大小的文件,所有这些都包含已知大小的样板页脚,我想删除它们。 我想知道是否已经有一个实用工具,然后自己写这个。

Solutions Collecting From Web of "尾倒/打印除最后n行之外的所有内容?"

头(1)的大多数版本 – GNU派生,特别是,但不是BSD派生 – 有一个功能来做到这一点。 它会显示文件的顶部,除了结尾,如果您使用负数打印的行数。

像这样:

head -n -10 textfile 

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

 tail -r file.txt | tail +NUM | tail -r 

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

没有标准的命令可以这样做,但是你可以使用awk或者sed来填充N行的缓冲区,并且一旦完成就从头部打印。 例如用awk:

 awk -vn=5 '{if(NR>n) print a[NR%n]; a[NR%n]=$0}' file 

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 

如果页脚以其他地方不存在的一致行开始,则可以使用sed

 sed '/FIRST_LINE_OF_FOOTER/q' filename 

打印页脚的第一行; 如果你想避免这一点:

 sed -n '/FIRST_LINE_OF_FOOTER/q;p' filename 

如果页脚的大小在将来发生变化,这可能比计数行更有力。 (或者如果第一行改变,它可能不那么健壮。)

另一个选项是,如果你的系统的head命令不支持head -n -10 ,则预先计算你想要显示的行数。 以下取决于特定于bash的语法:

 lines=$(wc -l < filename) ; (( lines -= 10 )) ; head -$lines filename 

请注意, head -NUMBER语法的head为了向后兼容性而被某些版本的head所支持; POSIX只允许使用head -n NUMBER表格。 POSIX也只允许参数-n是一个正的十进制整数; head -n 0不一定是空操作。

符合POSIX标准的解决方案是:

 lines=$(wc -l < filename) ; lines=$(($lines - 10)) ; head -n $lines filename 

如果你需要处理古代的POSIX炮弹,你可能会考虑这个:

 lines=`wc -l < filename` ; lines=`expr $lines - 10` ; head -n $lines filename 

如果一个文件长度不超过10行,其中任何一个都可能会造成奇怪的结果。

很简单。 你必须加上你想避免的行数。

这个例子给你所有的行,除了第一个9

tail -n +10输入文件

(是的,不是第一个10 …因为它计数不同…如果你想要10,只需输入tail -n 11 inputfile)