2011-12-06 32 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%