awk从开始匹配模式的最后一个匹配打印到结束模式

时间:2016-06-24 10:32:14

标签: bash shell awk

我有一个包含这样内容的文件。

if {[CELL NAME "CELL1"]} {
define_cell \
       -pinlist { i0 i1 i2 0 } \
       CELL1
}
if {[CELL NAME "CELL2"]} {
define_cell \
       -pinlist { i0 i1 i2 0 } \
       CELL2
}
define_cell \
       -pinlist { i0 i1 i2 0 } \
       CELL3  
define_cell \
       -pinlist { i0 i1 i2 0 } \
       CELL4

我想尝试这样的小节。

define_cell \
       -pinlist { i0 i1 i2 0 } \
       CELL3

当我尝试使用下面的简单脚本时,我实际上是从define_cell的第一个匹配到文件的结尾,这与我的期望相反。

awk '/define_cell/,/CELL3/{print $0}' <FILE>

我如何实现特定目标。我试图遵循这个建议的解决方案。 awk find the last match and print the next N lines 但是无法让它发挥作用。

2 个答案:

答案 0 :(得分:2)

使用GNU awk这样的东西可能会起作用:

awk '{$0=RT$0}/CELL3/' ORS= RS=define_cell input.txt

以上内容将在define_cell上拆分记录,然后打印包含CELL3的记录。

备选方案您可以使用以下内容存储要在r中打印的每一行,并在每次define_cell匹配时将其删除:

awk '/define_cell/ { l=1; delete r}
                 l { r[l++]=$0 }
           /CELL3/ { for(i=1;i<l;i++) print r[i] }' input.txt

您还可以使用tac从后面读取文件:

tac input.txt | awk '/CELL3/,/define_cell/' | tac

答案 1 :(得分:0)

使用grep简单回答:

grep -A 2 "^define_cell" input.txt | grep -B 2 "CELL3"

使用-A 2在第一次匹配后提取两行,并使用-B 2在最后一次匹配之前提取两行,这就是两种匹配方式。