awk从输出中删除空格

时间:2012-12-05 08:20:38

标签: objective-c macos unix awk

我使用@"df -lH | grep \"/Volumes/*\" | awk '{$1=$2=$3=$4=$5=$6=$7=$8\"\"; print $0 }'"获取本地安装的卷路径。但如果卷名包含两个或更多空格(Leopard 1)。它(awk)从输出中删除空格。

输出:

$df -lH

Filesystem     Size   Used  Avail Capacity  Mounted on
/dev/disk0s3    81G    61G    19G    77%    /
/dev/disk0s2    81G    72G   8.2G    90%    /Volumes/Leopard  1  2     3
/dev/disk0s4   158G    47G   111G    30%    /Volumes/Backup  

$ df -lH | grep "/Volumes/*"
/dev/disk0s2    81G    72G   8.2G    90%    /Volumes/Leopard  1  2     3
/dev/disk0s4   158G    47G   111G    30%    /Volumes/Backup  

$ df -lH | grep "/Volumes/*" | awk '{$1=$2=$3=$4=$5=""; print $0}'
     /Volumes/Leopard 1 2 3
     /Volumes/Backup

任何人都可以帮帮我吗?

4 个答案:

答案 0 :(得分:3)

默认情况下awk的输出字段分隔符是单个空格。因此,完全期望awk命令的输出。要获得您想要的结果,您需要使用某种正则表达式,因此请尝试使用GNU awk

df -lH | awk '/Volumes/ { sub(/^(\S+\s+){5}/, ""); print }'

或者如果你有GNU sed

df -lH | sed -nr '/Volumes/s/^(\S+\s+){5}//p'

结果:

/Volumes/Leopard  1  2     3
/Volumes/Backup  

编辑:

我很遗憾地看到BSD/OSX awk doesn't support interval expressions。因此,最安全的方法是使用awk

执行此操作
df -lH | awk '/Volumes/ { sub(/^[^ ]+ +[^ ]+ +[^ ]+ +[^ ]+ +[^ ]+ +/, ""); print }'

sed

df -lH | sed -n '/Volumes/s/^[^ ]\+ \+[^ ]\+ \+[^ ]\+ \+[^ ]\+ \+[^ ]\+ \+[^ ]\+ \+[^ ]\+ \+//p'

这也应该是非常便携的! HTH。

编辑:

对于包含8列的Mac OSX 10.8,只需扩展正则表达式:

df -lH | awk '/Volumes/ { sub(/^[^ ]+ +[^ ]+ +[^ ]+ +[^ ]+ +[^ ]+ +[^ ]+ +[^ ]+ +/, ""); print }'

sed

df -lH | sed -n '/Volumes/s/^[^ ]\+ \+[^ ]\+ \+[^ ]\+ \+[^ ]\+ \+[^ ]\+ \+//p'

答案 1 :(得分:1)

使用输出比mount更简单的df命令和支持非贪婪匹配的perl更容易:

:; mount | perl -pe 's/.*? on //;s/ \([^\)]*\)$//'
/
/dev
/Volumes/pro Time Machine 2
/Volumes/b
/Volumes/p
/net
/home

请注意,我在挂载点中安装了一个带空格的卷。

答案 2 :(得分:1)

df -lH | grep "/Volumes/*" | perl -pe 's/[^\%]*\%//g'

如果你想在awk中这样做:

df -lH | grep "/Volumes/*"|awk '{gsub(/[^\%]*\%/,"");print}'

答案 3 :(得分:0)

检查此命令的输出,可能有助于您解析并获取信息

mount | column -t