如何使用 UNIX 命令行过滤器丢弃文件的最后 n 行?
这与以下操作正好相反tail
:tail
丢弃前 n 行,但将其余行通过管道传输,但我希望命令将所有内容通过管道传输除了最后 n 行。
不幸的是我还没有找到类似的东西——head
也没有什么帮助。编辑:至少在 Solaris 中它不接受负面论点。
更新:我最感兴趣的是适用于大文件(即日志文件)的解决方案,您可能希望检查除最后几分钟之外发生的事情。
答案1
如果你有 GNU head
,你可以使用
head -n -5 file.txt
打印除最后 5 行之外的所有内容file.txt
。
如果head -n
没有负面论点,尝试
head -n $(( $(wc -l file.txt | awk '{print $1}') - 5 )) file.txt
答案2
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
答案3
这是一个删除最后一行的简单方法,适用于 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
以下是从我最喜欢的一句话改编而来的一句话:
count=10
sed -n -e ':a' -e "1,$count"'!{P;N;D;};N;ba'
我很高兴能破译这个,我希望你也一样(:它count
在扫描时会缓冲行,但除此之外非常高效。
注意:!
使用单引号括起来以避免被 Bash 解释(如果这是您的 shell)。将整个内容括起来的普通双引号适用于sh
,也可能适用于其他内容。
答案4
我很好奇您为什么认为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