Answers:
如果您有GNU head
,则可以使用
head -n -5 file.txt
打印的最后5行以外的所有内容file.txt
。
如果head -n
不带否定参数,请尝试
head -n $(( $(wc -l file.txt | awk '{print $1}') - 5 )) file.txt
file.txt
至少长六行...)
head
,则返回空输出,且无错误。
head file.txt # first 10 lines
tail file.txt # last 10 lines
head -n 20 file.txt # first 20 lines
tail -n 20 file.txt # last 20 lines
head -20 file.txt # first 20 lines
tail -20 file.txt # last 20 lines
head -n -5 file.txt # all lines except the 5 last
tail -n +5 file.txt # all lines except the 4 first, starts at line 5
这是删除最后一行的简单方法,该方法适用于BSD等。
sed '$d' input.txt
该表达式显示为“在最后一行,将其删除”。其他行将被打印,因为这是sed
默认行为。
您可以将它们链接在一起以删除多行
sed '$d' input.txt | sed '$d' | sed '$d'
诚然,这有点笨拙,但只扫描文件一次。
您还可以查看此内容,以获得更多答案: https //stackoverflow.com/questions/13380607/how-to-use-sed-to-remove-last-n-lines-of-a-file
这是我那里最喜欢的一种改编的单线纸:
N=10
sed -n -e ':a' -e "1,$N!{P;N;D;};N;ba"
我很高兴地破译了那个,并且我也希望你也能这样做(:它在N
扫描时确实缓冲行,但否则效率很高。
我很好奇您为什么认为head
没有选择:
~$ man 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
例如,这似乎符合您的目的:
head -n -20 yourfile.txt
head
。BSD head
没有这个选项,那么这个答案会不会在Solaris或其它Unix系统没有GNU的coreutils工作。OP还专门用Unix和Unix-Utils标记了这一点。
如果tail -n
不接受否定论点的另一种方法是
tac file.txt | tail -n +6 | tac
这将删除最后5行