2011-12-06 29 views
16

我在bash脚本中使用df命令:如何让GREP只选择数值?

df . -B MB | tail -1 | awk {'print $4'} | grep .[0-9]* 

此脚本返回:

99% 

但我只需要数(使下比较)。 如果我使用正则表达式grep不点:

df . -B MB | tail -1 | awk {'print $4'} | grep .[0-9]* 

我什么也得不到。 如何解决?

回答

36

如果你尝试:

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

它返回:

99 

下面是对-o(或--only-matching标志)的细节从grep manual page工作。

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

+0

您也可以使用别名'\ d'就像'echo“99%”| grep -o'\ d *'' –

+1

你确定@FabSa吗?你有没有做过测试? AFAK,grep默认使用BRE .. – Kent

+2

它适用于我(是在OsX上),但也许你需要“extended-regexp”(带'-E') –

8

grep将打印任何线匹配您提供的模式。如果你只想打印匹配模式行的一部分,您可以通过-o选项

-o,--only匹配 只打印匹配的(非空的)部分匹配线,每个这样的部分在一个单独的输出线上。

像这样:

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

这不适用于所有版本的grep。 您将需要-P或-E 因此,这将工作 回声'这是一条提到99%某处的路线'| 'grep -oP'[0-9] +' 或 echo'这是一条提到99%某处的路线'| grep -oP'[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]; 
} 
0

不要使用比必要的更多的命令,离开尾巴,grep和切。你可以只用(简单的)这样做的awk

PS:给予块大小连接打印只去persentage是有点傻;-)所以也放弃使用“-B MB”

df。| awk的-F '[多个领域分隔符]' '$ NF == “末场必须恰好 - >安装patition”{$打印(NF-从去年场数)}'

在你的情况下,使用方法:

df . |awk -F'[ %]' '$NF=="/" {print $(NF-2)}' 

输出:

如果你想显示百分比符号,你可以离开了-F'[%]的路程和打印领域将移动1场进一步回

df . |awk '$NF=="/" {print $(NF-1)}' 

输出:81%