【问题标题】:awk to print from last match of start match pattern till end patternawk 从开始匹配模式的最后一次匹配打印到结束模式
【发布时间】:2016-06-24 21:54:46
【问题描述】:

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

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 但无法让它工作。

【问题讨论】:

    标签: bash shell awk


    【解决方案1】:

    对于 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
    

    【讨论】:

    • 第一个解决方案用于 CELL4(列表中的最后一个)时出现问题。 define_cell 行不见了!任何线索如何解决? bash-4.2$ awk '{$0=RT$0}/CELL4/' ORS= RS=define_cell /tmp/input.txt \ -pinlist { i0 i1 i2 0 } \ CELL4
    【解决方案2】:

    grep 的简单回答:

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

    -A 2 在第一个匹配之后提取两行,-B 2 在最后一个匹配之前提取两行,这样就可以得到两个匹配。

    【讨论】:

      猜你喜欢
      • 2017-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-29
      • 1970-01-01
      • 2011-07-20
      • 1970-01-01
      相关资源
      最近更新 更多