awk 判断最后一行_awk连载3: awk里的BEGIN和END

本文详细介绍了awk中BEGIN和END的用法。BEGIN块通常用于预处理,例如设置变量和打印标题。END块则在处理完所有行后执行,常用于输出总结信息。通过实例演示了如何利用BEGIN指定分隔符、定义变量以及在END块中进行最终计算。
摘要由CSDN通过智能技术生成

前面讲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 ~]#

打印操作

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

a9801bc96e0801a53e3a4a1673350b8e.png 

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

指定分隔符

ae6404b216fd9716bca75a7e9ced9ca2.png 

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

2a2ee2fa56c45e43591c08d6e283f62e.png 

定义变量

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

438123f8bd822ee794fbdf059bf23159.png 

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

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

ec6ec5b9a45969cc24ea75f9028b0f08.png 

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

8eb99af330b4e7d14c22f8c75a18db2a.png 

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

63943f0d6512ab859fd8b680dadc329b.png 

先找到第二部分小于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的这些行,然后循环。对文件符合的行执行完操作之后,最后再次打印-----。

实战练习:

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

827625962b4a28c18cee582f8088712b.png 

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

答案如下:

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

12335

[root@vms63 ~]#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值