2012-12-05 96 views
1

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

任何人都可以请帮我吗?

+0

如果你可以发布你的'df -lh'输出,那么这个问题就会简单多了。 – Steve

+0

@steve输出更新。 –

回答

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 awkdoesn't support interval expressions不幸的。因此,最安全的方式将与awk做到这一点:

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

sed

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

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

编辑:

对于Mac OSX 10.8与8列,只是延长了正则表达式:

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

sed

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

第一个命令是给我/ dev/disk0s2 81G 72G 8.2G 90%/卷/豹3 4 4 /dev/disk0s4 158G 47G 111G 30%/卷/备份输出 –

+0

@ParagBafna:请参阅更新。 HTH。 – Steve

+0

@ParagBafna:没问题;我也添加了sed解决方案。祝你好运! – Steve

0

检查此命令的输出,可以帮助您分析和查看信息

mount | column -t 
+0

不幸的是,'column -t'不会有太大帮助,因为最大的问题是如何处理包含空格的挂载点。 –

1

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

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

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

+0

谢谢@rob mayoff。 –

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

,如果你想在awk中执行:

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

你永远不需要grep with awk。 'df -lH | awk'/ \/Volumes \ // {gsub(/ [^%] *%/,“”); print}''。我也放弃了那些对你的RE没有做任何事情的“*”,并且在%s之前摆脱了反斜杠,因为它们不是RE元字符,所以它们不需要被转义。 –