【问题标题】:awk print lines between 2 patterns - patterns passed as variablesawk 打印 2 个模式之间的行 - 作为变量传递的模式
【发布时间】:2020-07-21 16:50:23
【问题描述】:

我想打印包含“ABC”的行和空行之间的所有行。

awk '/ABC/,/^$/' file

这很好用

我想将 ABC 放入一个变量中。所以我将它传递给 awk,如下所示

awk -v targetLine='ABC' '/targetLine/,/^$/' file

这不会给我任何回报。

有人可以帮忙看看这里出了什么问题,为什么我的变量没有被拾起。

【问题讨论】:

标签: unix awk


【解决方案1】:

一个awk程序是由成对的

 pattern { action }

actionpattern 创建非零/非空值时执行。一种可能的模式是模式范围。一个模式范围只不过是两个用逗号分隔的模式。

pattern1 , pattern2 { action }

虽然大多数人使用 ERE 令牌将其写下来,例如:

/foo/,/bar/ { action }

模式可以是任何代表有效模式的东西,其他示例可能是:

(FNR==3),$0=="foo" {action}  or (index($2,"foo")>2),(FNR%5==4) {action}

因此,基于此,我们可以将您的问题回答为:

awk -v ere="ABC" '($0 ~ ere),/^$/'

但是,请注意,从您想使用模式范围稍微更改代码的那一刻起,您通常必须进行完全重写(请参阅Is a /start/,/end/ range expression ever useful in awk?):所以最好只写:

awk -v ere="ABC" '($0 ~ ere){f=1};f;/^$/{f=0}'

【讨论】:

    【解决方案2】:

    这是一种在 AWK 中传递变量而不使用 '-v' 选项的方法:

    var="ABC"
    awk '/'"$var"'/,/^$/' file
    

    并且使用“-v”选项:

    var="ABC"
    awk -v a=$var '$0 == a,/^$/' file
    

    【讨论】:

      猜你喜欢
      • 2016-01-04
      • 1970-01-01
      • 1970-01-01
      • 2018-09-28
      • 1970-01-01
      • 1970-01-01
      • 2013-03-12
      • 1970-01-01
      • 2016-01-04
      相关资源
      最近更新 更多