了解模式匹配后打印多行的语法

时间:2019-04-15 19:11:30

标签: awk

要使用awk在图案后打印多(2)行:

我在某处找到了以下解决方案

$ awk '/Linux/{x=NR+2}(NR<=x){print}' file
Linux
Solaris
Aix

我正在尝试了解语法

通常awk语法是

awk 'pattern{action}' file

在这里找到

pattern = /Linux/
action = {x=NR+2}

那么什么是(NR<=x){print}

解决方案:

我对此类似c的语法的理解是:

While read (file,line)
{
  if (line ~ '/pattern/') then
  {
    x= NR+2
  }
  if (NR <= x)
   {
     print
   {
}

对于NR = 1,如果(行〜'/ pattern /'),则x设置为NR + 2,例如(1 + 2 = 3)。在该过程结束之前,不会重置此值。因此,当读取下一行并且!(line〜'/ pattern /')时,x仍为3,(NR(2)<= 3)为true,因此将打印下一行 感谢@Edmorton的无私奉献

2 个答案:

答案 0 :(得分:0)

您的脚本有两个块

$ awk '/Linux/ {x=NR+2}
       NR<=x   {print}' file

第一个块设置变量x,第二个块用于打印行。请注意,您可以删除{print},因为它是默认操作。

答案 1 :(得分:0)

FWIW我不会编写您要询问的代码,而是写:

awk '/Linux/{c=3} c&&c--' file

请参见https://stackoverflow.com/a/17914105/1745001上的示例“ g”。

话虽如此,您使用C语法的原始代码将是:

NR=0
x=0
While read (file,line)
{
  NR++
  if (line ~ "Linux") {
    x = NR+2
  }
  if (NR <= x) {
    print
  }
}

顺便说一句,我知道它经常被滥用,但是由于它的模棱两可,所以不要在软件中使用“模式”一词-使用字符串或正则表达式或条件(或在shell中使用,但不要在awk,sed,grep等中使用)。且仅在适当的“ globbing pattern”(球状模式))中,无论您真正指的是什么。

例如,您写道awk语法是:

awk 'pattern{action}' file

不。或者,也许取决于您认为“模式”的含义!尽管有许多书,教程等说了这么多话,为了消除歧义,您应该简单地将awk语法视为:

awk 'condition{action}' file

其中condition可以是以下任意一种:

  1. 一个关键词,例如BEGINEND
  2. 诸如var < 7NF1之类的算术表达式
  3. 正则表达式比较,例如$0 ~ "foo"$0 ~ /foo//foo/$0 ~ varmatch($0,/foo/)
  4. 字符串比较,例如$0 == "foo"index($0,"foo")
  5. 完全没有,在这种情况下,当存在关联的动作块时,它假定为true

还有可能我忘记列出的其他内容。