在shell中提取两个行号之间的行

Hob*_*ire 5 bash shell sed

如何在shell中使用sed或任何其他过滤器

假设我在两个变量中有两个特定的行号$line1,$line2并且我想在这两行中提取这样的行

cat my_file_path | command $line1 $line2
Run Code Online (Sandbox Code Playgroud)

示例如果我的文件是:

1:BBB

2:CCCC

3:DDDD

4:EEEEE

如果我这样做,我的输出应该是:

cat my_file_path | command 1 3
Run Code Online (Sandbox Code Playgroud)

产量

bbb
cccc
Run Code Online (Sandbox Code Playgroud)

Mih*_*hai 10

使用sed:

$ cat my_file_path | sed -n "${line1},${line2}p"
Run Code Online (Sandbox Code Playgroud)

或者,甚至更好(cat在某种程度上是多余的):

$ sed -n "${line1},${line2}p" my_file_path
Run Code Online (Sandbox Code Playgroud)

  • 这个答案是不正确的,因为OP不想打印$ line1和$ line2行。 (2认同)

小智 7

您可以使用尾巴和头部的管道

tail -n +$line1 | head -n $((line2-line1))
Run Code Online (Sandbox Code Playgroud)


Ken*_*ent 5

未经测试:

awk -v s="$line1" -v e="$line2" 'NR>s&&NR<e' file
Run Code Online (Sandbox Code Playgroud)

您可以通过以下方式控制“包含/排除” >= or <=

如果您想使其在shell变量中的前导/尾随空格安全,请执行以下操作:

 awk -v s="$line1" -v e="$line2" 'NR>1*s&&NR<1*e' file
Run Code Online (Sandbox Code Playgroud)


Enr*_*cio 5

这是我在 Centos 上使用的,此示例从myFile.log打印 100 到 200 之间的行

 awk 'NR >= 100 && NR <= 200' myFile.log
Run Code Online (Sandbox Code Playgroud)

100 之前的其他示例行

awk  'NR <= 100' fileName.log
Run Code Online (Sandbox Code Playgroud)

请注意,您还可以使用 >,< 比较器。

对于更复杂的场景,此答案使用 NR 变量又名记录号,例如行号您可以查看 AWK 内置变量:https : //www.thegeekstuff.com/2010/01/8-powerful-awk-built- in-variables-fs-ofs-rs-ors-nr-nf-filename-fnr/

希望能帮助到你