如何让GREP只选择数值?

问题描述 投票:19回答:6

我在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]*

我一无所获。怎么修?

linux bash grep
6个回答
42
投票

如果你试试:

 echo "99%" |grep -o '[0-9]*'

它返回:

99

以下是来自-o--only-matching(或grep manual page旗帜)作品的详细信息。

仅打印匹配线的匹配(非空)部分,每个此类部分位于单独的输出线上。输出行使用相同的分隔符作为输入,如果还使用-z( - null-data),则分隔符为空字节(请参阅Other Options)。


9
投票

grep将打印与您提供的图案匹配的任何线条。如果您只想打印与模式匹配的行部分,可以传递-o选项:

-o, - only-matching仅打印匹配行的匹配(非空)部分,每个此类部分位于单独的输出行上。

像这样:

echo 'Here is a line mentioning 99% somewhere' | grep -o '[0-9]+'

1
投票

怎么样:

df . -B MB | tail -1 | awk {'print $4'} | cut -d'%' -f1

1
投票

这里不需要使用grep,试试这个:

df . -B MB | tail -1 | awk {'print substr($5, 1, length($5)-1)'}

1
投票
function getPercentUsed() {
    $sys = system("df -h /dev/sda6 --output=pcent | grep -o '[0-9]*'", $val);
    return $val[0];
}

1
投票

不要使用超过必要的命令,留下尾巴,grep和cut。你只用(一个简单的)awk就可以做到这一点

PS:给出一个块大小的打印只有百分比有点傻;-)所以也离开“-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%

© www.soinside.com 2019 - 2024. All rights reserved.