是否有一个(POSIX命令行)的方式来打印所有的文件除了最后n行? 用例是,我将有未知大小的文件,它们都含有已知大小,我想删除的样板页脚。 我在想,如果已经有一个实用工具,写我自己之前做到这一点。
Answer 1:
头(1)的大多数版本 - GNU衍生,特别是,但不是BSD衍生 - 有一个功能来做到这一点。 它会显示该文件的顶部,除了结束时,如果你使用一个负数行打印的份数。
像这样:
head -n -10 textfile
Answer 2:
可能比“WC” +“做数学” +“尾巴”的方法效率较低,而且更容易查看:
tail -r file.txt | tail +NUM | tail -r
其中NUM
是不是要删除结束的行数多一个,例如+11将打印所有,但最后10行。 这适用于BSD不支持的head -n -NUM
语法。
Answer 3:
该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
Answer 4:
有没有标准的命令,要做到这一点,但你可以用awk或sed的,填补了N行的缓冲区,并从打印头一旦它的全部。 例如使用awk:
awk -v n=5 '{if(NR>n) print a[NR%n]; a[NR%n]=$0}' file
Answer 5:
cat <filename> | head -n -10 # Everything except last 10 lines of a file
cat <filename> | tail -n +10 # Everything except 1st 10 lines of a file
Answer 6:
如果页脚一致行开始不会出现在其他地方,你可以使用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
的向后兼容; 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条或更少的线长可能会做奇怪的事情。
Answer 7:
很简单。 你必须+添加到您想要避免的行数。
这个例子给你,除了前9所有行
尾-n +10 inputfile中
(是的,也不是第10 ...因为它计算不同...如果你想10,只需要输入尾-n 11 inputfile中)
Answer 8:
TAC file.txt的| 尾+ [N + 1] | TAC
这个答案是类似于user9645的,但它避免了尾部-r命令,这也不是一个有效的选项许多系统。 见,例如, https://ubuntuforums.org/showthread.php?t=1346596&s=4246c451162feff4e519ef2f5cb1a45f&p=8444785#post8444785为例。
需要注意的是+1(括号)需要我试图在测试系统上,但它可能不是您的系统上是必需的。 因此,除去最后一行,我只好把2中的括号内。 这可能与你需要有正规换行符(S)结束最后一行的事实。 这一点,可以说,让最后一行空行。 如果你不这样做,那么TAC命令将在最后两行合并,因此删除了“最后”行(或第一个tail命令),将实际删除最后两行。
我的回答也应该是那些上市日期为缺乏头的改进版系统的最快的解决方案。 所以,我认为这是两个最强大和最最快列出的所有答案。