关于linux:打印一个文件,跳过Bash中的第一行X行

Print a file skipping first X lines in Bash

我有一个很长的文件,我想打印,但跳过了前1E6行。我看了看猫的手册,但我没有任何选择。我正在寻找一个执行此操作的命令或一个简单的bash程序。


你需要尾巴。一些例子:

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

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

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

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

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

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

1
2
$ tail -n <N> <filename>
< last N lines of file. >


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

1
tail -n +1000001 huge-file.log

你想做什么就做什么。从手册页引用:

If the first character of K (the number of bytes or lines) is a
`+', print beginning with the Kth item from the start of each file.

因此,如注释中所述,+1000001开始打印,第一个项目位于前1000000行之后。


最简单的方法是删除文件的前十行:

1
$ sed 1,10d file.txt


不那么冗长的awk版本:

1
awk 'NR > 1e6' myfile.txt

但我建议使用整数。


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

例子:

1
2
3
4
5
6
$ perl -wle 'print for (1..1_000_005)'|sed '1,1000000d'
1000001
1000002
1000003
1000004
1000005


如果要跳过前两行
tail -n +3

如果要跳过第一行x
tail -n +$((x+1))


如果您想看到前10行,可以使用下面的sed:

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

或者,如果要查看20到30之间的行,可以使用:

1
sed -n '20,30 p' myFile.txt

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

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

用于此示例文件(file.txt):

1
2
3
4
5
6
one
two
three
four
five
six

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

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

此命令的输出:

1
2
3
two
three
four

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


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

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

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

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

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


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

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

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


1
sed -n '1d;p'

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


1
cat < File > | awk '{if(NR > 6) print $0}'


我也需要这么做,找到了这根线。

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

更多的+行在这个提示上工作得很好,但结果表明,当以headless模式(cronjob)运行时,它的行为完全不同。

最后我自己写了这个:

1
2
3
skip=5
FILE="/tmp/filetoprint"
tail -n$((`cat"${FILE}" | wc -l` - skip))"${FILE}"