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