awk的sub函数获取并计算df磁盘使用率需要注意数据类型转换

2760阅读 0评论2018-05-15 Shell_HAT
分类:LINUX

网友提问:


当前文件系统,有两个使用率大于60%的文件系统,/和/mnt/suseISO
#df -h
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 237M     0  237M   0% /dev
tmpfs                    244M     0  244M   0% /dev/shm
tmpfs                    244M  1.8M  243M   1% /run
tmpfs                    244M     0  244M   0% /sys/fs/cgroup
/dev/mapper/system-root  9.8G  5.7G  3.6G  62% /
tmpfs                     49M     0   49M   0% /run/user/0
/dev/sr0                 4.4G  4.4G     0 100% /mnt/suseISO

执行语句1后发现只显示了/目录,执行语句2可以显示/mnt/suseISO目录。不明白为什么这样。

语句1:
#df -k|sed '1d'|awk 'sub("%","",$5) {if ($5 > 60) print $6}'
/

语句2:
#df -k|sed '1d'|awk 'sub("%","",$5) {if ($5 > 10) print $6}'
/
/mnt/suseISO

原因分析:sub之后的数据类型是字符串,不能直接用于数字比较

# echo 12% | gawk '{sub("%","",$1);print "$1:"typeof($1); if($1>2)print $1">2";else print $1"<=2"}'
$1:string
12<=2 (这个显然不是我们想要的结果)

解决方法1:使用自动类型转换 $1+0
# echo 12% | gawk '{sub("%","",$1);print "$1:"typeof($1)" $1+0:" typeof($1+0); if(($1+0)>2)print $1">2";else print $1"<=2"}'
$1:string $1+0:number
12>2

解决方法2:使用强制类型转换 strtonum($1)
# echo 12% | gawk '{sub("%","",$1);print "$1:"typeof($1)" strtonum($1):" typeof(strtonum($1)); if(strtonum($1)>2)print $1">2";else print $1"<=2"}'
$1:string strtonum($1):number
12>2

本文使用的 gawk 的版本是 4.2.1
低版本的 gawk 可能不支持 typeof
上一篇:WebLogic/WebSphere等中间件控制台语言切换
下一篇:没有了