引发这个问题的具体问题是,我正在编写一个 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,两者都给出了相同的结果。
这里不需要正则表达式,它会增加不必要的复杂性。因此,除非您真的想通过正则表达式来执行此操作,否则只需选择“使用”列并使用它即可。然后清理 % 就可以了。
zca@elitedesk:~$ df -k | awk '{print $5}'
Use%
1%
24%
0%
0%
28%
2%
3%
1%
你需要这个:
$ 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%