封装{}的awk语法

时间:2013-09-22 16:13:15

标签: awk nawk

据我了解,在awk中,可以使用以下任一方式开始条件评估:

if ($0 ~ /no/) {cmd}
($0 ~ /no/) {cmd}
$0 ~ /no/ {cmd}
/no/ {cmd}

在通用命令行中

BEGIN {  }  (body) END {  }

我发现将(正文)括在括号中是最合乎逻辑的,如{(body}(简称“括号”)。

在GNU awk,Ubuntu 12.04中,如果括号中只有4个选项中的第1个执行 - 至少在我的机器上(其他产生语法错误)。如果我在没有括号的情况下运行该线路,只有第一条线路失败,其余3条线路正常。有人可以仔细解释为什么会这样吗?

2 个答案:

答案 0 :(得分:3)

从语法上讲,awk脚本是一组规则,如下面的[Ref]

pattern { action }
pattern { action }
.... 

其中pattern是表达式,action是一系列命令,如果pattern被评估为true(非零数字或非空字符串),则执行这些命令)。

如果省略pattern,则会为每条记录执行action

如果省略{ action }部分,则执行默认操作,即{ print $0 }{ print }(等效)。

正如您在问题中提到的,pattern可以是BEGINEND,...等,或任何其他表达式。

您的第一个示例将在{ action }块中正确执行,因为它是一个命令。其他三个选项不是命令,而是pattern { action }块的组合。

答案 1 :(得分:3)

awk语句遵循以下规则:

PATTERN{action}

所以BEGINEND只是特殊的PATTERN。基本上如果PATTERN为true,请在{..}

中执行操作

PATTERN可以是正则表达式,表达式和范围也为空

空模式如下:

awk '{print "foo"}' input

您可以阅读http://www.gnu.org/software/gawk/manual/gawk.html第7.1节中的deatails。

回到你的问题,如果你在Action部分中执行了这4行,也就是在{...}之间(实际上是空模式),只有第一行if是有效的条件语句。但是,如果您使用匹配检查作为模式,(在{..}之外):

if ($0 ~ /no/) {cmd} # this would ***NOT*** work, because it is statment, not valid awk expression. (I don't know how did you make it work.)

($0 ~ /no/) {cmd} # this will work, it is a boolean expression

$0 ~ /no/ {cmd} # same as above

/no/ {cmd} # this is regexp pattern, so it works too.