【问题标题】:How to display all the lines from the nth line of a file in unix如何在unix中显示文件第n行的所有行
【发布时间】:2014-10-29 23:50:09
【问题描述】:

我想显示从第 n 行开始的所有行。比如说,打印文件的第三行和所有以下行,直到文件结束。有这个命令吗?

【问题讨论】:

    标签: linux bash unix sh


    【解决方案1】:

    打印,但删除第 1 到 2 行:

    sed '1,2d' filename
    

    【讨论】:

      【解决方案2】:

      你可以使用sed:

      sed -n '3,$p' file
      

      【讨论】:

      • 您本可以解释语法所代表的含义,而不是用垃圾填满您的答案。
      • 呵呵,它代表了问题的答案,这是OP要求的。如果他们想学习 sed,这不是那个论坛,是吗?
      【解决方案3】:

      你可以用尾巴

      摘自手册页:

         -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 行开始输出文件内容

      【讨论】:

      • 好一个我不知道尾部功能
      • @Auspex:不确定你是不是想在那里搞笑:-)。并不是说 SO 更快;没有手册页可以回答海报的既定目标。作为一个使用了数十年的用户,我不知道 tail 做到了这一点(我会转向我所知道的,单行 awk 或 Perl sn-p)。
      • @Crossfit_and_Beer 不想搞笑;我想我是在看到其他人抱怨如果这个人只是阅读手册页就可以回答一个问题之后写的。我指出,由于之前似乎没有在这里回答过上述问题,因此拥有它是完全合适的,并且在 SO 上有一个答案。 '因为这是寻找答案的地方。但是有 手册页可以回答 OP 的问题。 tail 联机帮助页!
      • @Auspex:But there is a manpage that answers the OP's question. The tail manpage!。不,他的问题特别提到了Is there a command for that?,这清楚地表明他不知道相关的命令名是什么。
      【解决方案4】:

      awk 命令可以通过仅将行打印到NR 记录号为三个或更多的行来做到这一点:

      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
      

      你很难找到比这更短的命令。当然,假设您在 UNIXy 环境中(特别是 bash),您也可以:

      alias x awk 'NR>=3'
      

      :-)

      【讨论】:

      • {print} 是隐含的,如果你不放任何东西,那么awk 'NR&gt;=3' file 会做。
      • export 在这里没有用处。
      • @tripleee:第一次计数正确(如此更改),第二次无关。无论是否导出,我只是在展示如何使用 shell 变量。已调整答案以将其删除。
      【解决方案5】:

      你可以像这样使用awk

      awk 'BEGIN{n=5}NR<=n{next}1' file
      
      • BEGIN{n=5} - 在文件处理开始之前,将 n 设置为要跳过的行数 (5)。
      • NR&lt;=n{next} - 如果行号小于或等于 n,则跳过处理。
      • 1 - print 其他所有内容的简写。

      【讨论】:

      • 最短的是awk 'NR&gt;5' file,但既然已经建议了,我想补充一下awk,就像sed支持范围运算符一样。所以,awk 'NR==5,0' file 也可以。
      【解决方案6】:

      从第 5 行开始显示:

      awk 'NR>4' file
      

      【讨论】:

      • 轻微的挑剔。它将从第 6 行开始显示,但仍然 +1。
      • 感谢您的编辑。不确定谁对您的好答案投了反对票。希望其他人意识到并推动它。
      猜你喜欢
      • 1970-01-01
      • 2018-11-16
      • 2014-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-30
      相关资源
      最近更新 更多