解析 df -k 输出以获取利用率详细信息

问题描述 投票:0回答:2

引发这个问题的具体问题是,我正在编写一个 bash 脚本来使用

df -k
检查磁盘利用率,并希望脚本在利用率超过阈值(例如 90%)时执行某些操作。

所以我得到这样的一行:

/dev/xvda1       8376300 7611164    765136  91% /

如何获得91%的部分?在我看来,我们可以将行分解为非空白块,然后是空白块,并且这种模式重复,最后一次出现包含 91%,即“91%”。事实上,当我使用 regex101.com 并输入

([^\s]+[\s]+)+

它给出了一个有希望的结果:

尤其是很高兴看到

重复捕获组将仅捕获最后一次迭代。在重复组周围放置一个捕获组以捕获所有迭代,或者如果您对数据不感兴趣,则使用非捕获组

正如 regex101.com 所说,我指定了一个重复的捕获组,只有最后一个“91%”会作为

Group 1
返回。完美。

但是,当我在 bash 中使用这个正则表达式来提取所需的部分时,它以某种方式将整行作为输出。

$ df -k | grep xvda1 | sed "s/\([^\s]+[\s]+\)+/\1/"
/dev/xvda1       8376300 7610788    765512  91% /

知道出了什么问题吗? bash 的正则表达式实现(ERE suppositly)是否不遵循捕获重复捕获组的最后一个捕获组的行为?在 regex101.com 中,没有 ERE 选项,因此我尝试使用 PCRE 和 PCRE2,两者都给出了相同的结果。

parsing sed
2个回答
1
投票

这里不需要正则表达式,它会增加不必要的复杂性。因此,除非您真的想通过正则表达式来执行此操作,否则只需选择“使用”列并使用它即可。然后清理 % 就可以了。

zca@elitedesk:~$ df -k | awk '{print $5}'
Use%
1%
24%
0%
0%
28%
2%
3%
1%

0
投票

你需要这个:

$ df --help
...
 --output[=FIELD_LIST]  use the output format defined by FIELD_LIST,
                        or print all fields if FIELD_LIST is omitted.
...

$ man df
...
 FIELD_LIST is a comma-separated list of columns to be included.  
 Valid field names are: 
    'source', 'fstype', 'itotal', 'iused', 'iavail', 
    'ipcent', 'size', 'used', 'avail',  'pcent',
    'file' and 'target' (see info page).
...

$ df -k --output=pcent
Use%
  0%
  1%
 90%
  7%
  1%
  0%
 47%
 12%
  2%
 83%
  1%
© www.soinside.com 2019 - 2024. All rights reserved.