当前位置: 首页>编程语言>正文

linux输出test文件第五行 linux 输出文件第一行

我有一个很长的文件,我想打印,但跳过了前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


https://www.xamrdz.com/lan/5pf1961324.html

相关文章: