如何让GREP只选择数值?

时间:2011-12-06 16:02:06

标签: linux bash grep

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

我一无所获。 怎么解决?

7 个答案:

答案 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 仅打印匹配行中匹配的(非空)部分,每个这样的部分都打印在单独的输出行上。