如何将 df -k 命令中的数字与 % 相匹配

如何将 df -k 命令中的数字与 % 相匹配

在我的 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匹配/varmountponit

  • 正则表达式/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}'

相关内容