awk 从输出中删除空间



>我正在使用@"df -lH | grep "/Volumes/*" | awk '{$1=$2=$3=$4=$5=$6=$7=$8""; print $0 }'"来获取本地挂载的卷路径。 但如果卷名包含两个或更多空间(豹 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

谁能帮我?

默认情况下,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不支持间隔表达式。因此,最安全的方法是使用 awk 执行此操作:

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

或带sed

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

这也应该是高度便携的!呵呵。

编辑:

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

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

或带sed

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

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

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

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

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

如果你想在 awk 中执行此操作:

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

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

mount | column -t

最新更新