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

时间:2014-02-13 16:14:18

标签: bash shell sed

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

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

cat my_file_path | command $line1 $line2

示例,如果我的文件是:

1:BBB

2:CCCC

3:DDDD

4:EEEEE

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

cat my_file_path | command 1 3

输出

bbb
cccc

6 个答案:

答案 0 :(得分:9)

使用sed:

$ cat my_file_path | sed -n "${line1},${line2}p"

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

$ sed -n "${line1},${line2}p" my_file_path

答案 1 :(得分:5)

未经测试:

awk -v s="$line1" -v e="$line2" 'NR>s&&NR<e' file

您可以使用>= or <=

控制“包含/排他”

如果你想让shell var中的前导/尾随空格安全:

 awk -v s="$line1" -v e="$line2" 'NR>1*s&&NR<1*e' file

答案 2 :(得分:4)

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

tail -n +$line1 | head -n $((line2-line1))

答案 3 :(得分:0)

这是我在Centos上使用的示例,此示例从 myFile.log

打印100至200行
 awk 'NR >= 100 && NR <= 200' myFile.log

100之前的其他示例行

awk  'NR <= 100' fileName.log

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

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

希望有帮助

答案 4 :(得分:0)

使用awk:

awk 'NR==100, NR==200' myfile.log
awk 'NR==100, NR==200; NR==200 {exit}' myfile.log # optimized

第二个程序具有优化功能,它会在打印所需范围的最后一行之后退出。

使用了范围模式

范围模式由两个用逗号分隔的模式组成,格式为“ begpat,endpat”。它用于匹配连续输入记录的范围。
https://www.gnu.org/software/gawk/manual/html_node/Ranges.html

模式可以是 regexp模式表达模式。上面使用表达模式与NR进行比较。

答案 5 :(得分:0)

使用 sed 打印(仅!)100 和 200 之间的行:

sed '1,100d;200,$d' file

优化:遇到范围结束时退出。

sed -n '1,100b;200q;p' file

优化使用 b 命令:

<块引用>

b – 无条件分支(即:总是跳转到一个标签,跳过 或重复其他命令,而不重新开始新的循环)

[...] 如果省略了标签,分支命令将重新开始循环。

GNU sed manual: branching and flow control

测试优化是否有效。

seq 1 100000 > file # A file with 10,000 lines
echo
echo "Without optimization:"
time sed '1,100d;200,$d' file >/dev/null
echo
echo "With optimization:"
time sed -n '1,100b;200q;p' file >/dev/null

输出:

Without optimization:

real  0m0.004s
user  0m0.003s
sys   0m0.001s

With optimization:

real  0m0.001s
user  0m0.000s
sys   0m0.001s