awk连载3: awk里的BEGIN和END

前面讲awk对一个文件进行处理的时候,是一行行的读取文件的。那么在awk真正对文件里的行进行循环之前,可以先做一些准备工作,这个准备工作就需要在BEGIN里做。

一般情况下,在BEGIN里用于打印一些标题,及设置一些变量。

格式:

awk ‘BEGIN{操作}  条件{print 语句}’ file

这里先执行BEGIN里的操作,然后再对file进行循环,找到含有指定条件的行,进行print操作。

再看aa.txt的内容:

[root@vms63 ~]# cat aa.txt

aaa 1 root 11111

bbb 2 ro2t 222 ddd aaa

ccc 3 xxxx  r22t  dddd

ddd 4 yyy  root 222

eee 5 aaa zzz

[root@vms63 ~]#

打印操作

比如下面的例子:在打印的结果前输入一排横线:

awk连载3: awk里的BEGIN和END 

注意:BEGIN里的print本来就出现在{}里,所以print打印的内容不要写{}

指定分隔符

awk连载3: awk里的BEGIN和END 

 

在BEGIN的大括号里也可以指定多个操作,用分号隔开:

awk连载3: awk里的BEGIN和END 

定义变量

在BEGIN里可以先定义变量,引用变量时直接写变量名即可,前面不需要加$。如下面的例子:

 

awk连载3: awk里的BEGIN和END 

 

首先在BEGIN里定义了变量aa的值为1,后面print直接打印aa即打印1。因为条件判断里要找的是第三列满足r后面有两个字符,第四个字符为t的,只有2行满足,所以此处打印了两行1.

如果这里引用变量时写成$aa, 则是$1的意思,就是打印第一部分:

awk连载3: awk里的BEGIN和END 

 

当然aa变量也可以在后面的大括号里定义,比如:

awk连载3: awk里的BEGIN和END 

 

变量可以不明确的赋值,可以在操作过程中,根据读取到的值进行赋值,比如:

awk连载3: awk里的BEGIN和END 

先找到第二部分小于2的行,应该是aaa 1 root 11111,然后对该行进分段,把第二部分也就是1这个值赋值给xx,xx在此并没有事先定义出来。现在xx的值为1, 然后打印$xx即$1,那么现实出来的值就是aaa。

 

END的用法

END一般用于在awk循环完一个文件所有行之后,最后才执行的操作。

END一般用户打印最后结束的结束栏,或者做最终的计算。

再看一个例子:

[root@vms63 ~]# awk 'BEGIN{FS=":";print"----"} $1~"r..t"{print $1} END{print "--------"}' /etc/passwd

----

root

dockerroot

--------

[root@vms63 ~]#

 

这里首先在BEGIN里定义分隔符为:,然后打印----, 再然后循环/etc/passwd的内容,找到满足第一个部分符合正则r..t的这些行,然后循环。对文件符合的行执行完操作之后,最后再次打印-----。

 

实战练习:

查看当前系统的内存使用情况,如下:

awk连载3: awk里的BEGIN和END 

现在想计算出来,物理内存和swap空间总共生的空间是多少,即上图圈起来的部分的和。

答案如下:

[root@vms63 ~]# free -m | tail -n +2 | awk '{sum+=$4}END{print sum}'

12335

[root@vms63 ~]#

相关新闻

发表回复

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

                                                                                                                                    RHCE9学习指南连载,点击阅读