如何在Unix中显示从文件的第n行开始的所有行

44
我想显示从第n行开始的所有行。 比如说,打印文件的第三行以及后续的所有行直到文件结尾。 是否有相应命令可以实现这个功能?
6个回答

70
你可以使用tail

来自manpage的摘录:

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

输出从第10行开始的文件内容。


好的,我之前不知道那个尾部功能。 - Juan Diego Godoy Robles
@Auspex:不确定你是否想要搞笑 :-)。并不是因为SO更快,而是没有一个manpage能够回答帖子作者所述的目标。作为一个使用了几十年的用户,我甚至不知道tail可以这样做(我会转向我所知道的,一个一行的awk或Perl片段)。 - Scott Prive
1
@Crossfit_and_Beer 不是想搞笑;我想是在看到别人抱怨一个问题如果那个人只是读了手册就能得到答案后,我写下了这句话;我指出既然这个问题似乎以前没有在这里得到过回答,那么在SO上提问和回答是完全合适的。因为这是寻找答案的地方。但是确实有一个手册可以回答OP的问题。tail手册! - Auspex
1
@Auspex:但是有一个手册可以回答OP的问题。就是tail手册!不,他的问题明确提到了有没有相应的命令?这清楚地表明他不知道相关的“命令名称”是什么。 - Scott Prive
有没有一种方法可以不使用文件,而是使用终端输出来完成这个操作?例如,我正在尝试执行 tail -n +6 $(git status),我希望它能给我一个已编辑文件的列表,但实际上它会进入文件本身并从第六行开始提取,这不是我想要的。 - stevec
理解 git status -s | cut -c 4- | xargs code - stevec

16
你可以使用sed
sed -n '3,$p' file

这将选择第三行到末尾并打印它。


6
你可以解释一下这个语法代表的意思,而不是填充无用信息。 - Michael
呵呵,这代表了对问题的回答,也就是OP所要求的。如果他们想学习sed,这不是适合的论坛,对吧? - Alain Collins

15

从第5行开始显示:

awk 'NR>4' file

1
小问题。从第6行开始显示,但无论如何都会加1。 - jaypal singh
感谢您的编辑。不确定是谁给您的好回答投了反对票。希望其他人能认识到它的价值并支持它。 - jaypal singh

5
您可以像这样使用awk
awk 'BEGIN{n=5}NR<=n{next}1' file
  • BEGIN{n=5} - 在文件处理开始之前,将 n 设置为要跳过的行数(5)。
  • NR<=n{next} - 如果行号小于或等于 n,则跳过处理。
  • 1 - 打印其他所有内容的简写形式。

2
最短的方法是 awk 'NR>5' file,但既然已经有人提出了这个建议,我想补充一下,就像 sed 一样,awk 也支持范围操作符。因此,awk 'NR==5,0' file 也可以工作。 - jaypal singh

5

打印输出,但删除1至2行:

sed '1,2d' filename

4
< p > 使用awk命令,只需将行打印到记录号NR大于或等于三的行即可:< /p >
awk 'NR>=3' input_file_name

如果需要,您也可以使用变量将值传递给 awk

awk -v n=3 'NR>=n' input_file_name

您可以使用-v n=${num}来使用环境变量。还有许多其他工具可以用于执行相同的任务,其中包括tailsedperl,或者,既然这是一个编程问答网站,您也可以自己编写:

#include <stdio.h>

int main (void) {
    // Need character and # of newlines to skip.

    int ch, newlines = 2;

    // Loop until EOF or first lines skipped, exit on EOF.

    while ((ch = getchar()) != EOF)
        if ((ch == '\n') && (--newlines == 0))
            break;

    if (ch == EOF)
        return 0;

    // Now just echo all other characters, then return.

    while ((ch = getchar()) != EOF)
        putchar (ch);

    return 0;
}

通常情况下,您不会为此编写自己的过滤程序。但是,既然您要求最短的命令,您可以使用该源代码创建一个名为x的可执行文件来完成此操作:

x <input_file_name

如果您在UNIX环境下(特别是bash),那么很难找到比这更短的命令了。当然,您也可以使用以下命令:

alias x awk 'NR>=3'

:-)


如果您不输入任何内容,{print} 将被隐含。所以 awk 'NR>=3' file 将会执行。 - tripleee
这里的“export”没有任何有用的目的。 - tripleee
@tripleee:在第一个问题上说得对(所以已经更改),在第二个问题上无关紧要。无论它是否被导出,我只是展示如何使用shell变量。已经调整了答案以删除那部分内容。 - paxdiablo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接