1

我正在使用 Runtime.getRuntime().exec("df") 来获取我的分区的空间详细信息。

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 命令仅将第 2、第 3 和第 4 列作为输出 - 按如下方式更改标题 - 可用内存、已用内存和总内存完全按此顺序。
所以所需的输出是:

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

谢谢!

4

3 回答 3

2

以下相当长的字符串可以满足您的要求:

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

解释:

| 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

我的机器上的结果:

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

没有磁盘名称就不是非常有用,但这就是您要问的...

于 2013-11-03T15:02:50.940 回答
0

您可以使用它awk来执行此操作:

df | awk '{print ""$4" "$3" "$2""}'
于 2013-11-03T14:53:11.277 回答
0

对我来说这有效

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

这不好:它发现列是由空格分隔的非空格,这有点脆弱。它根据列名将最后一列计算为总和或“总计”。相当脆弱,我会说。

于 2013-11-03T14:59:34.020 回答