如何"grep"出文件的特定行范围

50 command-line grep

我经常会grep -n whatev文件找到我正在寻找的东西.说输出是

1234: whatev 1
5555: whatev 2
6643: whatev 3
Run Code Online (Sandbox Code Playgroud)

如果我想在1234和5555之间提取线条,是否有工具可以做到这一点?对于静态文件,我有一个脚本,它执行文件的wc -l然后进行数学运算以使用tail和head将其拆分,但这对于不断写入的日志文件来说效果不佳.

Sco*_*hio 78

尝试使用http://linuxcommando.blogspot.com/2008/03/using-sed-to-extract-lines-in-text-file.html中提到的sed .例如使用

sed '2,4!d' somefile.txt
Run Code Online (Sandbox Code Playgroud)

从somefile.txt的第二行到第四行打印.(别忘了查看http://www.grymoire.com/Unix/Sed.html,sed是一个很棒的工具.)

  • 一个有用的后续信息是如何在sed结果前面添加行号...将它管道化为nl,如下所示:`sed''"$ start"','"$ end"'!d'tomefile.txt | nl -ba -v $ start` (5认同)
  • @ManuelJordan `d` 是 sed 的删除命令。`!` 反转限制(即在本例中为指定范围)。所以 `2,4!d` 意味着删除除第 2-4 行之外的所有内容。 (3认同)

jav*_*e42 23

以下命令将执行您在someFile中 "提取1234和5555之间的行"的要求.

sed -n '1234,5555p' someFile

  • 我必须添加`/`分隔符以使其起作用:`sed -n'/ 1234 /,/ 5555 / p'someFile` (2认同)

Mar*_*ata 5

如果我理解正确,您希望在两个行号之间找到一个模式.awk one-liner可能是

awk '/whatev/ && NR >= 1234 && NR <= 5555' file
Run Code Online (Sandbox Code Playgroud)

您不需要运行grep后跟sed.

Perl单线:

perl -ne 'if (/whatev/ && $. >= 1234 && $. <= 5555') {print}' file
Run Code Online (Sandbox Code Playgroud)


小智 5

如果你能保证你想要的位置,行号就可以了。多年来,我最喜欢的味道是这样的:

sed "/First Line of Text/,/Last Line of Text/d" filename
Run Code Online (Sandbox Code Playgroud)

它删除从第一个匹配的行到最后一个匹配的所有行,包括那些行。

使用 sed -n和“ p ”而不是“ d ”来打印这些行。对我来说更有用,因为我通常不知道这些线在哪里。