我有一个很长的文件,我想打印,但跳过了前1E6行。我看了看猫的手册,但我没有任何选择。我正在寻找一个执行此操作的命令或一个简单的bash程序。
你需要尾巴。一些例子:
$ tail great-big-file.log
< Last 10 lines of great-big-file.log >
如果您确实需要跳过特定数量的"第一"行,请使用
$ tail -n +
< 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
< last N lines of file. >
或"tail--lines=+…",用于可读命令群组:-)
在Centos 5.6中,tail -n +1显示了整个文件,tail -n +2跳过了第一行。奇怪。同样适用于tail -c +。
尼克,你可能碰到了windows风格的行尾。
@乔尔克拉克不,@nicksoft是对的。在Ubuntu上,它是tail -n +,我刚测试过。因此,tail -n +1不会跳过任何内容,而是从第一行开始。
我可以确认,tail -n +2也需要跳过darwin/mac os x上的第一行。
这肯定是过时的,但是tail-n+2或tail-n+2可以工作,就像所有使用getopt的短命令一样,您可以在它的开关旁边运行参数,前提是开关是组中的最后一个,显然tail-nv+2这样的命令不起作用,它必须是tail-vn+2。如果你不相信我,你自己试试。
在Solaris上,您需要使用:/usr/xpg4/bin/tail(在手册页中找到)。
如果系统上有GNU尾,可以执行以下操作:
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行之后。
也适用于BSD tail(OS X)
最简单的方法是删除文件的前十行:
$sed 1,10d file.txt
在更一般的情况下,您必须使用sed 1,Xd,其中x是要删除的初始行数,x大于1。
如果你不知道文件有多长时间,也不想让tail打印最后的100000000行,这就更有意义了。
不那么冗长的awk版本:
awk 'NR > 1e6' myfile.txt
但我建议使用整数。
如果需要跳过文件中间的一些行,例如awk '!(5 < NR && NR < 10)'行,则非常有用。
只是提出一个sed替代方案。:)要跳过前100万行,请尝试|sed '1,1000000d'。
例子:
$ perl -wle 'print for (1..1_000_005)'|sed '1,1000000d'
1000001
1000002
1000003
1000004
1000005
@马龙,对不起,但那是错的。仅适用于1d。例如,如果在2d上使用它,则只删除第2行。它不会删除行的范围。
@A-B-B对不起,意思是说这是迄今为止最简单的解决方案,这就是为什么我+1它不试图纠正作者。
如果要跳过前两行
tail -n +3
如果要跳过第一行x
tail -n +$((x+1))
这有点误导人,因为有人可能从字面上解释(x+1)。例如,对于x=2,它们可以键入(2+1)甚至(3),两者都不起作用。写它的一个更好的方法可能是:跳过前x行,y=x+1,使用tail -n +Y。
如果您想看到前10行,可以使用下面的sed:
sed -n '1,10 p' myFile.txt
或者,如果要查看20到30之间的行,可以使用:
sed -n '20,30 p' myFile.txt
这个shell脚本对我来说很好:
#!/bin/bash
awk -v initial_line= -v end_line= '{
if (NR >= initial_line && NR <= end_line)
print ++用锥子,它比尾巴稍微轻便一点。
使用带有范围地址的sed delete命令。例如:
$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
}'
用于此示例文件(file.txt):
one
two
three
four
five
six
命令(它将从文件的第二行提取到第四行):
edu@debian5:~$./script.sh 2 4 file.txt
此命令的输出:
two
three
four
当然,您可以改进它,例如,通过测试所有参数值都是预期的:—)
sed -n '1d;p'
此命令将删除第一行并打印其余行
cat < File > | awk '{if(NR > 6) print skip=5
FILE="/tmp/filetoprint"
tail -n$((`cat"${FILE}" | wc -l` - skip))"${FILE}"
}'
无论GNU实用程序是否存在,此解决方案都应该在所有UNIX系统上可靠地工作。
对于cli和脚本,最容易使用的答案。
您可以使用head和tail命令执行此操作:
head -n | tail -n
其中num是1e6+要打印的行数。
不是最有效的答案,因为您需要在文件上做一个"wc-l"来获得行数,然后再加上一个百万:-)。你只需要"尾巴"就可以做到。
我不确定,我的理解是打电话的时候会知道1E6。倒计时不是最快的。
这是bash中的一个语法错误——它在什么shell中工作?
我在bash中运行这个。不是命令的一部分,文件名应替换""
awk 'NR > 6 {print}'就足够了…不需要if或$0。
我也需要这么做,找到了这根线。
我试过"tail-n+",但它只是打印了所有内容。
更多的+行在这个提示上工作得很好,但结果表明,当以headless模式(cronjob)运行时,它的行为完全不同。
最后我自己写了这个:
太复杂
正确链接猫奖的无用使用。前一个被广告取代。
@我不认为"cat"是无用的,因为"cat wc-l"产生的输出与简单的"wc-l"不同。前者适用于算术运算,后者则不适用。
@杰克,我不是在评判使用cat的时候,只是在评论中修改了一个链接,导致了一个死页面。原始注释必须已被删除。不管怎样,谢谢你指出这一点。
@你知道吗?在阅读了链接之后,我认为这里使用"cat"是错误的:)它应该类似于"wc-l