2012-12-05 93 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元字符,所以它們不需要被轉義。 –