在我的 bash 脚本中,我想通过 df -k 命令打印 /var 分区的使用容量
我执行以下操作
df -k | grep var | awk '{print $5}'
问题是有时“use%”数字存在于第四个字段上,有时存在于第五个字段上,有时在其他字段上存在六个或更多
所以我想匹配数字%var 分区的
请建议如何匹配 var 分区的 use% 数量(优雅的方式)
谢谢
例子1
df -k
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda3 13204256 4247972 8274728 34% /
/dev/sda5 5080796 141540 4677000 3% /tmp
/dev/sda2 14013128 7578564 5711240 58% /var
/dev/sda1 194442 40649 143754 23% /boot
tmpfs 1037756 0 1037756 0% /dev/shm
例子2
df -k
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/SysGroup-lv_root
18578172 2680752 14953704 16% /
tmpfs 510240 0 510240 0% /dev/shm
/dev/sda1 198337 50064 138033 27% /boot
/dev/mapper/SysGroup-lv_tmp
5160576 141464 4756968 3% /tmp
/dev/mapper/SysGroup-lv_var
28899452 3481568 23949880 13% /var
答案1
纯 grep 解决方案怎么样?
df -k | grep var | grep -o '[0-9]*%'
然后,您可以在 Perl regexp 的帮助下连接这两个 grep:
df -k | grep -Po 'var.* \K[0-9]*%'
答案2
您可以使用正则表达式来匹配 % 数字:
df -k | grep -E ' /run$' | grep -Eo '[0-9]+%'
一些解释。
df -k
不言自明:它显示磁盘可用表
grep -E '/var$'
使用扩展正则表达式引擎来
grep
匹配/var
mountponit正则表达式
/var$
将模式锚定到行尾,因此它不会与任何 匹配/var/run
,/var/tmp
这是一个简单的grep var
情况。另请注意斜杠之前的空格。grep -Eo '[0-9]+%'
-E
将在 Grep 中启用 PCRE 正则表达式-o
将仅打印匹配的字符串
正则表达式非常简单:
[0-9]
匹配任意数字+
表示将匹配至少一位数字%
将匹配%
字符
示例输出:
$ df -k | grep -E ' /var$' | grep -Eo '[0-9]+%'
1%
好的一点是 Use% 位于哪个位置并不重要。
如果您的 grep 支持 PCRE 正则表达式(例如,Mac OSX 不支持),您可以使用单个正则表达式:
df -h | grep -Po '[0-9]+%(?= /var$)'
这使用 Perl 正则表达式,并使用“向后查找”来锚定模式/var$
并匹配正则表达式。如果您好奇,可以阅读有关此功能的内容本教程。
答案3
这是您需要的优雅解决方案:
如果你只想要 /var,那么
df --output=pcent /var
如果你想使用 grep
df --output=source,pcent | grep var
或者您可以使用 posix 格式,其中第五个字段始终为 Use%
df -k --portability | grep var | awk '{print $5}'
答案4
您可以使用:
.... | awk '{print $(NF-1)}'
如果输出的标题df
包含模式,这可能会导致打印grep
。为了避免这种情况,您可以:
.... | awk '$(NF-1) ~ /%/'
更通用的方法,POSIXly,使用-P
选项df:
df -P | .... | awk '{print $5}'