前面讲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 ~]#
打印操作
比如下面的例子:在打印的结果前输入一排横线:
注意:BEGIN里的print本来就出现在{}里,所以print打印的内容不要写{}
指定分隔符
在BEGIN的大括号里也可以指定多个操作,用分号隔开:
定义变量
在BEGIN里可以先定义变量,引用变量时直接写变量名即可,前面不需要加$。如下面的例子:
首先在BEGIN里定义了变量aa的值为1,后面print直接打印aa即打印1。因为条件判断里要找的是第三列满足r后面有两个字符,第四个字符为t的,只有2行满足,所以此处打印了两行1.
如果这里引用变量时写成$aa, 则是$1的意思,就是打印第一部分:
当然aa变量也可以在后面的大括号里定义,比如:
变量可以不明确的赋值,可以在操作过程中,根据读取到的值进行赋值,比如:
先找到第二部分小于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的这些行,然后循环。对文件符合的行执行完操作之后,最后再次打印-----。
实战练习:
查看当前系统的内存使用情况,如下:
现在想计算出来,物理内存和swap空间总共生的空间是多少,即上图圈起来的部分的和。
答案如下:
[root@vms63 ~]# free -m | tail -n +2 | awk '{sum+=$4}END{print sum}'
12335
[root@vms63 ~]#