简要介绍awk的程序运行模型

最近在学习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变量的内容。


以上是我个人的理解,由于本人才疏学浅,因此如果有什么不对的地方,还请朋友们帮我纠正。谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值