在awk中,您可以同时使用模式和END块吗?

时间:2019-01-02 15:31:00

标签: awk

在awk中,您可以针对给定的模式执行操作,例如:

echo foo | awk '/foo/ {print "foo"}'

或者您可以在输入末尾执行操作,例如:

echo foo | awk 'END {print "END"}'

但是似乎不可能同时做到这两个,例如:

# echo foo | awk '/foo/ || END {print "foo or END"}'
awk: syntax error at source line 1
 context is
    /foo/ || >>>  END <<<  {print "foo or END"}
awk: bailing out at source line 1

这可能吗?

4 个答案:

答案 0 :(得分:6)

不。改为这样做:

\b

答案 1 :(得分:0)

您可以尝试此解决方法

awk '{Last=$0} END{ if( Last ~ /foo/) print "action if" }' YourFile

但仅用于最后一个文件的最后一行

答案 2 :(得分:0)

这可能更简单

$ awk '/foo/{exit} END{print "foo or END"}'

exit将运行END块,因此您无需重复该语句。

答案 3 :(得分:0)

不,您不能做这种事情。 END语句在处理完最后一行后执行,与BEGIN类似,它们是模式的特殊形式。

  

总体计划结构

     

awk程序由成对的   形式:

pattern { action }
     

patternaction(包括括号在内)   字符)可以省略。

     

模式

     

模式是任何有效的表达式,范围是由两个表达式之间用逗号分隔的,是两个特殊模式BEGINEND 之一。

     

特殊模式

     

awk实用程序应识别两个特殊模式BEGINEND。每个BEGIN模式应匹配一次,并在读取输入的第一条记录之前执行其关联的动作-除非可能在先前的{中使用getline函数(请参见输入/输出和通用函数) {1}}操作-在完成命令行分配之前。每个BEGIN模式应匹配一次,并在读取最后一条输入记录后执行其关联的动作。这两种模式应具有关联的动作。

     

ENDBEGIN不得与其他模式组合。允许使用多个ENDBEGIN模式。与END模式相关联的动作应按照程序中指定的顺序执行,就像BEGIN动作一样。在程序中,END模式可以在END模式之前。

     

来源:awk POSIX standard

声明

BEGIN
因此

不允许使用,因为它将/foo/ || END { action } 与另一个模式结合在一起。

有关优雅的解决方案,请参见Ed Morton的答案。