1

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

4 回答 4

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 不支持区间表达式。因此,最安全的方法是这样做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'
于 2012-12-06T07:51:48.730 回答
1

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

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

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

于 2012-12-06T07:27:49.233 回答
1
df -lH | grep "/Volumes/*" | perl -pe 's/[^\%]*\%//g'

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

df -lH | grep "/Volumes/*"|awk '{gsub(/[^\%]*\%/,"");print}'
于 2012-12-06T08:37:20.733 回答
0

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

mount | column -t
于 2012-12-05T10:01:52.177 回答