打印一个文件,跳过Bash中的第一行X行

Edu*_*rdo 498 linux printing bash skip

我有一个很长的文件,我想打印但跳过第一个1e6行例如.我查看了猫手册页,但我没有看到任何选项.我正在寻找一个命令来做这个或一个简单的bash程序.

Sin*_*ion 805

你需要尾巴.一些例子:

$ tail great-big-file.log
< Last 10 lines of great-big-file.log >
Run Code Online (Sandbox Code Playgroud)

如果你真的需要跳过特定数量的"第一"线,请使用

$ tail -n +<N+1> <filename>
< filename, excluding first N lines. >
Run Code Online (Sandbox Code Playgroud)

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

$ tail -n +11 /tmp/myfile
< /tmp/myfile, starting at line 11, or skipping the first 10 lines. >
Run Code Online (Sandbox Code Playgroud)

如果你想看到最后这么多行,省略"+":

$ tail -n <N> <filename>
< last N lines of file. >
Run Code Online (Sandbox Code Playgroud)

  • 或"tail --lines = + <LinesToSkip> ..."为可读命令人群:-) (56认同)
  • 在centos 5.6`tail -n + 1`显示整个文件,`tail -n + 2`跳过第一行.奇怪.`tail -c + <num>`也一样. (20认同)
  • 我可以确认需要`tail -n + 2`来跳过Darwin/Mac OS X的第一行. (13认同)
  • @JoelClark不,@ NickSoft是对的.在Ubuntu上,它是`tail -n + <start number>`,我刚刚测试过它.所以`tail -n + 1`不会跳过任何东西,而是从第一行开始. (11认同)
  • 这必须是过时的,但是,tail -n + 2或者tail -n +2可以工作,就像使用getopt的所有短命令一样,你可以在它的开关旁边运行参数,前提是交换机是组中的最后一个,显然像tail -nv + 2这样的命令不起作用,它必须是tail -vn + 2.如果你不相信我自己尝试. (2认同)

Dav*_*rks 102

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

$ sed 1,10d file.txt
Run Code Online (Sandbox Code Playgroud)

  • 在更一般的情况下,你必须使用`sed 1,Xd`,其中X是要删除的初始行数,X大于1. (13认同)
  • 如果您不知道文件有多长并且不想告诉“tail”打印最后 100000000 行,那么这更有意义。 (2认同)

Edd*_*die 94

如果您的系统上有GNU尾部,则可以执行以下操作:

tail -n +1000001 huge-file.log
Run Code Online (Sandbox Code Playgroud)

+是完成你想要的角色.引用手册页:

如果K的第一个字符(字节数或行数)是"+",则从每个文件的开头以Kth项开始打印.

因此,如评论中所述,将+1000001开始使用第一个1,000,000行之后的第一个项目进行打印.


new*_*ver 27

使用AWK的简洁版本:

awk 'NR > 1e6' myfile.txt
Run Code Online (Sandbox Code Playgroud)

但我建议使用整数.

  • 如果您需要跳过文件中间的某些行,例如'awk'!(5 <NR && NR <10),则非常有用 (7认同)

小智 16

如果你想跳过前两行
tail -n +3 <filename>

如果你想跳过第一个x行
tail -n +$((x+1)) <filename>

  • 这有点误导,因为有人可能从字面上解释`(x + 1)`.例如,对于x = 2,它们可以键入`(2 + 1)`或甚至`(3)`,两者都不起作用.写一个更好的方法可能是:要跳过前X行,Y = X + 1,使用`tail -n + Y <filename>` (2认同)

mae*_*ics 15

使用带有范围地址sed delete命令.例如:

$ sed 1,100d file.txt # Print file.txt omitting lines 1-100.
Run Code Online (Sandbox Code Playgroud)

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

$ sed -n 201,300p file.txt # Print lines 201-300 from file.txt
Run Code Online (Sandbox Code Playgroud)

无论是否存在GNU实用程序,此解决方案都应在所有UNIX系统上可靠地运行.


tuo*_*alo 14

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

例:

$ perl -wle 'print for (1..1_000_005)'|sed '1,1000000d'
1000001
1000002
1000003
1000004
1000005
Run Code Online (Sandbox Code Playgroud)

  • @Marlon,抱歉,这是错误的。这只适用于 1d。例如,如果您在 2d 上使用它,您将只删除第 2 行。它不会删除行的范围。 (2认同)

小智 13

如果你想看到前10行你可以使用sed如下:

sed -n '1,10 p' myFile.txt
Run Code Online (Sandbox Code Playgroud)

或者如果你想看到20到30行,你可以使用:

sed -n '20,30 p' myFile.txt
Run Code Online (Sandbox Code Playgroud)


sou*_*els 10

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

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

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

one
two
three
four
five
six
Run Code Online (Sandbox Code Playgroud)

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

edu@debian5:~$./script.sh 2 4 file.txt
Run Code Online (Sandbox Code Playgroud)

输出此命令:

two
three
four
Run Code Online (Sandbox Code Playgroud)

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


小智 8

sed -n '1d;p'
Run Code Online (Sandbox Code Playgroud)

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

  • @Tom,你不需要知道尾数,要跳过第一行,请使用 `tail +2` (3认同)

Dan*_*ane 6

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

head -n <num> | tail -n <lines to print>
Run Code Online (Sandbox Code Playgroud)

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

  • 不是最有效的答案,因为您需要对文件执行"wc -l"以获取行数,然后添加以添加百万:-).你可以用"尾巴"来做到这一点. (3认同)

aam*_*deo 6

cat < File > | awk '{if(NR > 6) print $0}'
Run Code Online (Sandbox Code Playgroud)

  • `awk 'NR &gt; 6 {print}'` 就足够了......不需要 if 或 $0。 (2认同)