头的反面是什么?我只需要文件的前N行


142

由于未知长度的文本文件,我怎么能读,例如所有,但第2行的文件?我知道tail最后N行会给我,但我不知道N会提前多少。

所以对于一个文件

AAAA
BBBB
CCCC
DDDD
EEEE

我想要

CCCC
DDDD
EEEE

和一个文件

AAAA
BBBB
CCCC

我会得到

CCCC

Answers:


211

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应该为您提供所需的输出(从3rd开始)。


2
奇怪的是,我的手册页没有列出该选项,但效果很好-谢谢!
Nicholas MT Elliott

@Nicholas:很奇怪,我认为不管使用什么操作系统,它都是标准文档。我是从Windows内的Cygwin那里获取的,所以我不知道在各种Linux发行版中是什么样子。很高兴它起作用。
Joe Enos

@NicholasMTElliott man7像Joe Enos的手册页一样列出它,因此它很可能是手册页版本
UliKöhler16年

@SteveJorgensen:我不明白您的评论是指什么;似乎没有人建议使用head此功能?
ruakh

22

假设您的tail版本支持它,则可以指定在X行之后开始tail。您的情况是2 + 1。

tail -n +3

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

12

使用awk的简单解决方案:

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

我们其中之一感到困惑。问题说:“除了文件的前两行,其余所有”。该命令如何不符合要求?
2010年

6
{ print }是默认操作,可以省略。
Tripleee 2014年

8

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


按预期工作。.由于前2行后的行数未知。
kumarprd 2015年

6

tail -n +linecount filename将开始在线路输出linecountfilename,所以tail -n +3 filename 应该做你想要什么。


这在我的外壳中不起作用,但tail -n +17 filename可以。我使用bash / ubuntu LTS
同构性

2
@iso:感谢您的注意-较早的版本tail接受了我在原始答案中使用的语法,但是现在需要使用显式-n选项。我已经相应更新了我的答案。
吉姆·刘易斯

0

使用此方法,假设第一个样本名为sample1.dat,那么tail --lines=3 sample1.dat它将打印从第三行到最后一行的所有行。

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


@Jim:您和我的有什么区别?....同样的事情..:o我根据他的问题指的是两个示例数据文件输入,并显示了如何实现他所寻找的... 。
t0mm13b

好的...那他为什么要索要第二个样本并显示他想要的结果,这就是我使用的'tail --lines = -1'......当然,您可以完全省略文件名,而仍然可以充当管道...嗯
t0mm13b 2010年

@tommie:糟糕,忘了我说的关于管道的事...我一定在想其他一些实用程序。但是我的观点是,单个命令tail +3 anyfile给出一般情况下的期望结果,而tail --lines=N需要事先知道N才能给出期望的结果。
吉姆·刘易斯

@tommie:但这不是tail……“ 自下而上”吗?(Ba-dum TISH!谢谢,我将整周待在这里...)
Jim Lewis,2010年

0

我真的不知道该如何从尾巴或头做,但是借助wc -l(行数)和bash表达式,您可以实现。

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

希望这可以帮助。


1
这要求在运行tail之前对文件进行完全传递。如果文件大于内存大小,这将是非常低效的。它不能处理少于两行的文件。它不处理wc和tail之间的文件更改大小。
2010年

2
@janm:你还好。其他答案更好。不好意思 :-p
NawaMan 2010年

-1

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

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

awk获取除前2行外的所有内容

awk 'NR>2' file

或者您可以使用更多

more +2 file

或只是重击

#!/bin/bash

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

现在,这不符合要求。这个问题说“除了文件的前两行之外的所有内容”,并给出两个示例,每个示例包含一个文件,其中跳过前两行,并将文件的其余部分发送到stdout。这不是该命令的作用。
10年

是的,我读错了问题。以为他只要求最后两行。
ghostdog74
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.