2013-11-03 56 views
1

我正在使用Runtime.getRuntime()。exec(「df」)來獲取我的分區的空間詳細信息。使用正則表達式或unix來選擇特定列

Filesystem  1K-blocks Used Available Use% Mounted on 
/dev/sdb12  41022792 4219168 34713128 11%/
udev    8103980  4 8103976 1% /dev 
tmpfs   3245332  924 3244408 1% /run 
none    5120  0  5120 0% /run/lock 
none    8113328  160 8113168 1% /run/shm 
/dev/sdb2   262144 28584 233560 11% /boot/efi 

如何使用正則表達式或UNIX命令來獲取作爲輸出只是第二,第三和第四列 - 改變標題如下 - 可用內存,使用的內存和總內存正是在這個順序。
因此所需的輸出是:

Available Used  Total 
34713128 4219168 41022792 
8103976  4  8103980 
3244408  924  3245332 
      ... 

謝謝!

+0

這絕對是'awk'的工作,而不是'regex'。那會好嗎? – Floris

+1

只要我可以在getRuntime()。exec(...)中執行它,是的! –

+0

你想要中間那樣的文字居中列,還是右對齊首選(如原始命令) – Floris

回答

2

下相當長的字符串做什麼你問:

df | awk 'BEGIN {print " Available  Used  Total";} {if (NR>1) printf("%12d%12d%12d\n", $4, $3, $2);}' 

說明:

Available  Used  Total 
    71644456 551306776 623463232 
      0   372   372 
      0   0   0 
      0   0   0 
    407510704 377391216 784901920 
    618400760 549288520 1167689280 

不是沒有的名稱非常有用:我的機器上

| awk   take the output of the df command as input to awk 
BEGIN   do this first: print headers. Note the use of spaces to align things 
if (NR > 1) skip "record 1" = do not do anything with the headers 
printf()  do formatted printing 
%12d   print integer in fixed width of 12 characters (maintains alignment 

結果磁盤,但這就是你要求的...

+0

謝謝!這工作 –

+1

樂於幫助 - 顯然上述可以在很多方面進行修改,我希望你會...... awk是真正的完美的工具,非常值得熟悉它。它可能是模糊的,但卻是驚人的強大。我發現的最佳參考是布魯斯巴奈特寫的格瑞米爾(不尋常的詞意思是「法術書」)。 Google'grymoire awk'。 – Floris

0

您可以使用awk做到這一點:

df | awk '{print ""$4" "$3" "$2""}' 
+0

不給正確的標題... – Floris

+0

我修改了順序。我不會嘗試在Unix命令中修改頭文件;只需對產生的Java字符串進行替換即可。 – syrion

0

對於我這種工作

df | perl -pe \ 
    's!^(?:\S+\s+){2}(\S+)\s+(\S+).*!"$1\t$2\t" . ($1 eq "Used" ? "Total" : $1 + $2)!e' 

這不是很好:它發現列,用空格分隔非空白,這是一個有點脆弱。它根據列名計算最後一列作爲總和或「總計」。我會說,這很脆弱。

相關問題