在运维工作中,时刻关注分区利用率是很有必要的,通常可以编写脚本定时监测分区的利用率,超过一定警戒数值则通过邮件、短信、微信等方式向运维人员发出警报,提醒运维人员及时作出处理。而编写这样一个脚本的关键,在于取出分区利用率数值。本文通过利用linux文本处理三剑客grep、sed、awk分别实现,从中可以看出文本三剑客各自解决问题的思路、特点和优长。

待处理数据:利用df命令所看到的分区使用情况

通常,利用df命令查看到的分区使用情况是这样的,以我在虚拟机上安装的centos8为例:

这里我们只关心分区的利用率,也就是/dev/sd开头的那几行,目标就是将这几行中use%的数值取出,进行排序,得到数值最大的那个。

1.用grep的方式实现

原理:
1.用grep过滤出以/dev/sd开头的行
2.用tr命令压缩空格并将空格替换为%
3.用cut命令,以%为分隔符,取出想要的数值

代码实现:

1
df | grep "^/dev/sd" | tr -s " " % | cut -d% -f5 | sort -nr | head -1

总结:使用grep有点繁琐但很有趣,充分体现了linux的哲学思想:组合多个功能单一的小工具来实现复杂功能。

2.用sed的方式实现

原理:
1.定位到以/dev/sd开头的行
2.用分组替换的方式取出想要的数值

代码实现:

1
df | sed -nr  "/^\/dev\/sd/s#.*  ([0-9]+)%.*#\1#p"  | sort -nr | head -1

总结:sed作为万金油般的存在,一专多能,无往不利,但sed的灵魂终究在于编辑和修改。个人认为,还是让sed回归主责主业,对于取个数值这种事情,就交给awk吧。

3.用awk的方式实现

原理:
1.定位到以/dev/sd开头的行
2.以空格和%为分隔符,取出想要的数值

代码实现:

1
df  |  awk -F"[[:space:]]+|%"  '/^\/dev\/sd/{print $5}' | sort -nr | head -1

总结:三种实现方式当中,awk是最简单,最不用费脑子,最没有技术含量的一种,但这也恰恰说明了,这种事情是awk最适合干的。