我在bash脚本中使用df
命令:
df . -B MB | tail -1 | awk {'print $4'} | grep .[0-9]*
此脚本返回:
99%
但我只需要数字(进行下一次比较)。
如果我使用grep
正则表达式而不使用点:
df . -B MB | tail -1 | awk {'print $4'} | grep .[0-9]*
我一无所获。 怎么解决?
答案 0 :(得分:42)
如果您尝试:
echo "99%" |grep -o '[0-9]*'
它返回:
99
以下是-o
(或--only-matching
标志)的详细信息,适用于grep manual page。
仅打印匹配线的匹配(非空)部分,每个此类部分位于单独的输出线上。输出行使用相同的分隔符作为输入,如果还使用-z( - null-data),则分隔符为空字节(请参阅Other Options)。
答案 1 :(得分:9)
grep
将打印与您提供的模式匹配的任何行。如果您只想打印与模式匹配的行部分,则可以传递 -o 选项:
-o, - 仅匹配 仅打印匹配行的匹配(非空)部分,每个此类部分位于单独的输出行上。
像这样:
echo 'Here is a line mentioning 99% somewhere' | grep -o '[0-9]+'
答案 2 :(得分:1)
怎么样:
df . -B MB | tail -1 | awk {'print $4'} | cut -d'%' -f1
答案 3 :(得分:1)
不需要在这里使用grep,试试这个:
df . -B MB | tail -1 | awk {'print substr($5, 1, length($5)-1)'}
答案 4 :(得分:1)
function getPercentUsed() {
$sys = system("df -h /dev/sda6 --output=pcent | grep -o '[0-9]*'", $val);
return $val[0];
}
答案 5 :(得分:1)
不要使用超过必要的命令,留下尾巴,grep和cut。你只能用(简单的)awk
来做到这一点 PS:给一个块大小的打印只有de persentage有点傻;-)所以请离开" -B MB"df。 | awk -F' [多个字段分隔符]' ' $ NF ==" 最后一个字段必须正好 - >挂载" {print $(NF- 最后一个字段的数字)}'
在您的情况下,请使用:
df . |awk -F'[ %]' '$NF=="/" {print $(NF-2)}'
输出: 81
如果要显示百分比符号,可以保留-F' [%]'离开,您的打印区域将向后移动1个字段
df . |awk '$NF=="/" {print $(NF-1)}'
输出: 81%
答案 6 :(得分:0)
您也可以使用Perl样式的正则表达式。那么一个数字就是\d
。
grep -Po "\\d+" filename
-P 将模式解释为与Perl兼容的正则表达式(PCRE)。
-o 仅打印匹配行中匹配的(非空)部分,每个这样的部分都打印在单独的输出行上。