据我了解,在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条线路正常。有人可以仔细解释为什么会这样吗?
答案 0 :(得分:3)
从语法上讲,awk脚本是一组规则,如下面的[Ref]:
pattern { action }
pattern { action }
....
其中pattern
是表达式,action
是一系列命令,如果pattern
被评估为true(非零数字或非空字符串),则执行这些命令)。
如果省略pattern
,则会为每条记录执行action
。
如果省略{ action }
部分,则执行默认操作,即{ print $0 }
或{ print }
(等效)。
正如您在问题中提到的,pattern
可以是BEGIN
,END
,...等,或任何其他表达式。
您的第一个示例将在{ action }
块中正确执行,因为它是一个命令。其他三个选项不是命令,而是pattern { action }
块的组合。
答案 1 :(得分:3)
awk语句遵循以下规则:
PATTERN{action}
所以BEGIN
或END
只是特殊的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.