使用regex或unix选择特定列

时间:2013-11-03 14:49:48

标签: java regex unix

我正在使用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
             ...

谢谢!

3 个答案:

答案 0 :(得分: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

没有磁盘名称就没有用,但这就是你要问的......

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

对我而言,这是有效的

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

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