尾部的反义词:除最后 n 行之外的所有行

尾部的反义词:除最后 n 行之外的所有行

如何使用 UNIX 命令行过滤器丢弃文件的最后 n 行?

这与以下操作正好相反tailtail丢弃前 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

相关内容