首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >了解模式匹配后打印多行的语法

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

Stack Overflow用户
提问于 2019-04-16 03:11:30
回答 2查看 63关注 0票数 1

要使用awk打印遵循图案的多(2)行:

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

代码语言:javascript
复制
$ awk '/Linux/{x=NR+2}(NR<=x){print}' file
Linux
Solaris
Aix

我在试着理解语法

通常,awk语法是

代码语言:javascript
复制
awk 'pattern{action}' file

在这里我们可以找到

代码语言:javascript
复制
pattern = /Linux/
action = {x=NR+2}

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

解决方案:

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

代码语言:javascript
复制
While read (file,line)
{
  if (line ~ '/pattern/') then
  {
    x= NR+2
  }
  if (NR <= x)
   {
     print
   {
}

对于NR=1和if (行~‘/模式/’),则将x设置为NR+2,例如(1+2 =3)。该值在该过程结束之前不会被重置。因此,当读取下一行并且!(行~ '/pattern/')则x仍然为3时,(NR (2) <= 3)为真,因此它打印下一行,这要归功于@Edmorton

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-16 21:59:20

FWIW我不会写你所问的代码,相反,我会写:

代码语言:javascript
复制
awk '/Linux/{c=3} c&&c--' file

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

话虽如此,使用类似C的语法编写的原始代码应该是:

代码语言:javascript
复制
NR=0
x=0
While read (file,line)
{
  NR++
  if (line ~ "Linux") {
    x = NR+2
  }
  if (NR <= x) {
    print
  }
}

顺便说一句,我知道它经常被误用,但不要在你的软件中使用“模式”这个词,因为它是高度模糊的-使用字符串、regexp或条件(或者在shell中使用,但不使用awk、sed、grep等,并且只在适当的地方使用"globbing pattern"),无论你真正想要的是哪一个。

例如,您编写的awk语法是:

代码语言:javascript
复制
awk 'pattern{action}' file

不是的。或者,取决于你认为“模式”是什么意思!尽管许多书籍、教程等都在说,为了消除任何歧义,您应该简单地将awk语法视为:

代码语言:javascript
复制
awk 'condition{action}' file

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

对关键字进行正则表达式(如BEGIN )或END

  • an算术表达式(如var < 7NF ),或1

  • a正则表达式比较(如$0 ~ "foo"$0 ~ /foo//foo/$0 ~ var )或match($0,/foo/)

  • a字符串比较(如<代码>D24或index($0,"foo")

  • nothing ),在这种情况下,当存在关联的操作块时,假定为<代码>D28。<代码>H229<代码>G230

可能还有其他我忘了列出来的东西。

票数 0
EN

Stack Overflow用户

发布于 2019-04-16 03:56:40

您的脚本有两个块

代码语言:javascript
复制
$ awk '/Linux/ {x=NR+2}
       NR<=x   {print}' file

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55695841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档