最近在学习awk脚本简单编程,一开始对awk的程序执行过程感到疑惑,不过好好研读了《实践大师unix sed和awk编程》以后对awk的执行过程有了一定的了解,简单介绍如下。
当系统执行awk后,如果有BEGIN模式的话,那么awk将执行BEGIN模式内的语句。然后awk读入第一个输入行,并且将它按照默认的FS分割成字段。分割成字段后,awk检查被分割的输入行中的模式。一个awk模式是指一个模式和动作结构中的模式部分,如$1=="success"{print $1},其中$1=="success"就是模式部分,而后面部分是Action部分,即语句块组。
如果这个模式的值是真,那么awk执行这个动作,否则,不执行,继续执行其他的模式和动作结构。一个动作可能包含许多步。每一步可以包含多个操作、输出语句等等。如果没有其它一般模式和动作结构,那么awk继续读入下一行,知道所有行都被处理完。一旦所有的输入行都被读取,awk将执行END模式(如果END模式存在的话),然后退出。
在输入行被读入之前执行的第一步(BEGIN模式)------------>开始
读入每一个输入行并将输入行分割成字段。执行
模式和动作,直到一般模式处理完(即除了END模----------->主处理循环
式,没有其它模式)。继续读入输入行,直到
没有输入行存在。
当读完所有行后,执行的最后一步(END模式)-------------->结束
注意事项:如果awk程序中有BEGIN模式,那么在BEGIN模式中是不能使用在其它模式中声明的变量的,包括字段变量,因为在BEGIN模式中,其它变量是不可见的。如下图所示:
在所示代码中BEGIN模式中的name和$1变量都没有正常显示,同样在END模式中,处理输入行模式中的字段变量$1和name也是不可见的,但是在END模式中可以使用BEGIN模式中定义的变量,如var变量就能够正常显示。
在处理输入行模式中可以使用BEGIN模式中的变量,但是不能使用END模式中的变量,下面附上代码:
另外如果处理输入行模式中有和BEGIN模式中相同的变量,那么在输入行模式中可见的是在输入行中的变量,BEGIN模式中的变量被隐藏。如下代码所示:
处理输入行模式和BEGIN模式中都有var变量,在输入行模式中输出显示的内容是输入行中的var变量的内容。
以上是我个人的理解,由于本人才疏学浅,因此如果有什么不对的地方,还请朋友们帮我纠正。谢谢!