更好的awk格式

时间:2015-08-06 22:18:07

标签: awk

所以我有一些输出,如下:

   Total Size:               999.4 GB (999360274432 Bytes) (exactly 1951875536 512-Byte-Units)
   Volume Free Space:        320.4 GB (320392282112 Bytes) (exactly 625766176 512-Byte-Units)

我想把它告诉:

Total Size: 999.4 GB
Free Space: 320.4 GB

但是使用awk '{ print $1 " " $2 " " $3 " " $4 }'删除第二个'GB',因为第一行有四个要返回的字段,第二行有五个。

我知道必须有比使用substr更好的,更好的方式:

awk '{ print substr( $0, 0, 37 ) }'

(这让我很接近)。

或者我应该使用sed吗?

2 个答案:

答案 0 :(得分:4)

这可以通过将字段分隔符更改为:(

来实现
$ awk -F'[:(]' '{ print $1":"$2 }' file
Total Size:               999.4 GB 
Volume Free Space:        320.4 GB 

如果您要删除Volume

$ awk -F' *[:(] *' '{ sub(/^ *(Volume)? */, ""); printf "%-10s: %s\n",$1,$2 }' file
Total Size: 999.4 GB
Free Space: 320.4 GB

如果您的输入不仅包含空格而且还有标签,则需要更改上述内容。在那种情况下:

$ awk -F' *[:(][[:space:]]*' '{ sub(/^[[:space:]]*(Volume)?[[:space:]]*/, ""); printf "%-10s: %s\n",$1,$2 }' file
Total Size: 999.4 GB
Free Space: 320.4 GB

附录:计算可用空间百分比

$ awk -F' *[:(][[:space:]]*' '/Size/{s=$2} /Free/{f=$2} END{ printf "Total Size: %s\nFree Space: %s\nRatio:      %s%%\n",s,f,100*f/s }' file
Total Size: 999.4 GB
Free Space: 320.4 GB
Ratio:      32.0592%

答案 1 :(得分:0)

告诉awk使用不同的字段分隔符。在这种情况下,您有一个冒号,用于将文本与值分开。实际上,冒号成为您的字段分隔符:

cat <content> | awk -F: '{ print $1 $2 }'

然后字段$ 1包含前导文本,而字段$ 2包含后面的所有内容。