681

例如,我有一个很长的文件要打印,跳过前 1,000,000 行。

我查看了 cat 手册页,但没有看到任何选项可以执行此操作。我正在寻找执行此操作的命令或简单的 Bash 程序。

4

13 回答 13

1106

你需要尾巴。一些例子:

$ tail great-big-file.log
< Last 10 lines of great-big-file.log >

如果您确实需要跳过特定数量的“第一”行,请使用

$ tail -n +<N+1> <filename>
< filename, excluding first N lines. >

也就是说,如果要跳过 N 行,则开始打印第 N+1 行。例子:

$ tail -n +11 /tmp/myfile
< /tmp/myfile, starting at line 11, or skipping the first 10 lines. >

如果您只想查看最后这么多行,请省略“+”:

$ tail -n <N> <filename>
< last N lines of file. >
于 2009-03-03T02:24:05.813 回答
154

我发现删除文件前十行的最简单方法:

$ sed 1,10d file.txt

在一般情况下,X要删除的初始行数是多少,请将此归功于评论者和编辑:

$ sed 1,Xd file.txt
于 2012-10-17T07:17:01.723 回答
112

如果您的系统上有可用的 GNU tail,您可以执行以下操作:

tail -n +1000001 huge-file.log

它是+做你想做的事的角色。引用手册页:

如果 K 的第一个字符(字节数或行数)是“+”,则从每个文件开头的第 K 个项目开始打印。

因此,如注释中所述,将 +1000001 放在前 1,000,000 行之后的第一项开始打印。

于 2009-03-03T02:28:45.270 回答
44

如果你想跳过前两行:

tail -n +3 <filename>

如果你想跳过第一个 x 行:

tail -n +$((x+1)) <filename>
于 2013-07-09T18:10:26.630 回答
37

使用 AWK 的不那么冗长的版本:

awk 'NR > 1e6' myfile.txt

但我建议使用整数。

于 2013-04-26T14:31:59.840 回答
24

使用带有范围地址的seddelete命令。例如:

sed 1,100d file.txt # Print file.txt omitting lines 1-100.

或者,如果您只想打印已知范围,请使用带有-n标志的 print 命令:

sed -n 201,300p file.txt # Print lines 201-300 from file.txt

无论是否存在 GNU 实用程序,该解决方案都应该在所有 Unix 系统上可靠地工作。

于 2016-12-02T16:19:22.947 回答
17

采用:

sed -n '1d;p'

此命令将删除第一行并打印其余部分。

于 2018-08-03T16:23:44.437 回答
16

如果您想查看前 10 行,可以使用 sed,如下所示:

sed -n '1,10 p' myFile.txt

或者,如果您想查看从 20 到 30 的行,您可以使用:

sed -n '20,30 p' myFile.txt
于 2012-12-20T10:04:41.057 回答
14

只是提出一个sed替代方案。:) 要跳过前一百万行,请尝试|sed '1,1000000d'.

例子:

$ perl -wle 'print for (1..1_000_005)'|sed '1,1000000d'
1000001
1000002
1000003
1000004
1000005
于 2012-01-26T06:53:15.973 回答
11

这个 shell 脚本对我来说很好用:

#!/bin/bash
awk -v initial_line=$1 -v end_line=$2 '{
    if (NR >= initial_line && NR <= end_line) 
    print $0
}' $3

与此示例文件 (file.txt) 一起使用:

one
two
three
four
five
six

命令(它将从文件的第二行到第四行提取):

edu@debian5:~$./script.sh 2 4 file.txt

此命令的输出:

two
three
four

当然,您可以改进它,例如通过测试所有参数值是否符合预期:-)

于 2009-03-31T13:28:55.043 回答
9

您可以使用 head 和 tail 命令执行此操作:

head -n <num> | tail -n <lines to print>

其中 num 是 1e6 + 要打印的行数。

于 2009-03-03T02:25:27.043 回答
4
cat < File > | awk '{if(NR > 6) print $0}'
于 2012-11-21T20:14:27.230 回答
-2

我需要做同样的事情并找到了这个线程。

我尝试了“tail -n +,但它只是打印了所有内容。

更多的 + 行在提示符下工作得很好,但事实证明它在无头模式(cronjob)下运行时表现完全不同。

我终于自己写了这个:

skip=5
FILE="/tmp/filetoprint"
tail -n$((`cat "${FILE}" | wc -l` - skip)) "${FILE}"
于 2009-05-28T17:30:58.980 回答