Head 的反义词是什么? 除了文件的前 N 行,我想要所有的行

给定一个长度未知的文本文件,我如何读取,例如,所有的 但是文件的前2行?我知道 tail会给我最后 N 行,但我不知道提前 N 是什么。

为了一个文件

AAAA
BBBB
CCCC
DDDD
EEEE

我想

CCCC
DDDD
EEEE

还有一份文件

AAAA
BBBB
CCCC

我会得到公正

CCCC
93275 次浏览

使用它,假设第一个示例名为 sample1.dat,然后是 tail --lines=3 sample1.dat,它将打印从第3行到最后一行的所有行。

对于第二个示例,再次假设它被称为 sample2.dat,它将是 tail --lines=-1 sample2.dat,它将打印最后一行..。

tail -n +linecount filename将从 filenamelinecount行开始输出,因此 tail -n +3 filename 你想怎么做就怎么做。

tail --help提供以下信息:

  -n, --lines=K            output the last K lines, instead of the last 10;
or use -n +K to output lines starting with the Kth

因此,为了过滤掉第一个 2行,-n +3应该提供所需的输出(从第3行开始)。

假设您的 tail 版本支持它,您可以在 X 行之后指定启动尾部。在你的情况下,你会做2 + 1。

tail -n +3


[mdemaria@oblivion ~]$ tail -n +3 stack_overflow.txt
CCCC
DDDD
EEEE

我真的不知道如何做到这一点,只是从尾部或头部,但与 wc -l(行计数)和 bash 表达式的帮助下,你可以做到这一点。

tail -$(( $( wc -l $FILE | grep -Eo '[0-9]+' ) - 2 )) $FILE

Hope this helps.

一个使用 awk 的简单解决方案:

awk 'NR > 2 { print }' file.name

使用 awk 获取除最后两行之外的所有内容

awk 'FNR==NR{n=FNR}FNR<=n-3{print}' file file

除了前两行以外,其他的都看完了

awk 'NR>2' file

或者你可以使用更多

more +2 file

或者只是猛击

#!/bin/bash


i=0
while read -r line
do
[[ $i > 1 ]] && echo "$line"
((i++))
done <"file"

尝试 sed 1,2d。根据需要替换2。

head函数支持负数。

head --help


-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

例如,正数打印前2行。

 head -n +2


AAAA
BBBB

负数打印 第一2行的所有 除了

head -n -2


CCCC
DDDD
EEEE

注意,与 tail不同,这不需要事先知道文件中的行总数。不管有多少行,它都会排除前2行。类似地,tail -n -2的负数也可以用来删除文件的 最后2行。

注意,这里使用的是 GNU head 版本8.22。这个特性在最初发布时可能不可用。现在即使相当老的 Linux 发行版也可以使用它。