2016-02-04 44 views
0

我正在嘗試使用bash腳本從服務器收集基本磁盤空間信息,並以JSON格式存儲輸出。我正在尋找記錄可用的&使用的磁盤空間。存儲輸出diskspace df -h JSON

一個例子輸出DF -h的:

Filesystem      Size Used Avail Use% Mounted on 
udev       2.0G 4.0K 2.0G 1% /dev 
tmpfs       394M 288K 394M 1% /run 
/dev/mapper/nodequery--vg-root 45G 1.4G 41G 4%/
none       4.0K  0 4.0K 0% /sys/fs/cgroup 
none       5.0M  0 5.0M 0% /run/lock 
none       2.0G  0 2.0G 0% /run/shm 
none       100M  0 100M 0% /run/user 
/dev/sda2      237M 47M 178M 21% /boot 
/dev/sda1      511M 3.4M 508M 1% /boot/efi 

作爲一個例子,這是我怎麼想最終輸出的樣子。

{ 
    "diskarray": [{ 
    "mount": "/dev/disk1", 
    "spacetotal": "35GB", 
    "spaceavail": "1GB" 
    }, 
    { 
    "mount": "/dev/disk2", 
    "spacetotal": "35GB", 
    "spaceavail": "4GB" 
    }] 
} 

到目前爲止,我已經試過用awk:

df -P -B 1 | grep '^/' | awk '{ print $1" "$2" "$3";" }' 

與下面的輸出:

/dev/mapper/nodequery--vg-root 47710605312 1439592448; 
/dev/sda2 247772160 48645120; 
/dev/sda1 535805952 3538944; 

但我不知道我怎麼拿這些數據並將其存儲在JSON格式。

+0

我已經得到這個:df -P -B 1 | grep'^ /'| awk'{print $ 1「'$ 2」「$ 3」;「 }' – westcoastdev

+1

您應該編輯您的問題以包含您嘗試的解決方案,並告訴我們您遇到了哪些問題。你會得到更好的反應,「這是我的嘗試,這是它不起作用」,而不是「我想這樣做,告訴我怎麼做」。 – miken32

+0

對不起,我編輯過,這個網站相當新,一般情況下,我發現其他例子,我發現做類似的事情。 – westcoastdev

回答

0

下你想要做什麼,與外界唯一的要求打壞是一個Python解釋:

python_script=$(cat <<'EOF' 
import sys, json 

data = {'diskarray': []} 
for line in sys.stdin.readlines(): 
    mount, avail, total = line.rstrip(';').split() 
    data['diskarray'].append(dict(mount=mount, spacetotal=total, spaceavail=avail)) 
sys.stdout.write(json.dumps(data)) 
EOF 
) 

df -Ph | awk '/^\// { print $1" "$2" "$3";" }' | python -c "$python_script" 

使用jq可能是這樣的另一種實現:

df -Ph | \ 
    jq -R -s ' 
    [ 
     split("\n") | 
     .[] | 
     if test("^/") then 
     gsub(" +"; " ") | split(" ") | {mount: .[0], spacetotal: .[1], spaceavail: .[2]} 
     else 
     empty 
     end 
    ]' 
+0

這正是我想要做的。非常感謝! – westcoastdev

+0

很高興幫助!我還添加了一個'jq'實現(它也在內部執行'awk'的工作)。 –

1

你可以做:

$ df -Ph | awk '/^\// {print $1"\t"$2"\t"$4}' | python -c 'import json, fileinput; print json.dumps({"diskarray":[dict(zip(("mount", "spacetotal", "spaceavail"), l.split())) for l in fileinput.input()]}, indent=2)' 
{ 
    "diskarray": [ 
    { 
     "mount": "/dev/disk1", 
     "spacetotal": "931Gi", 
     "spaceavail": "623Gi" 
    }, 
    { 
     "mount": "/dev/disk2s2", 
     "spacetotal": "1.8Ti", 
     "spaceavail": "360Gi" 
    } 
    ] 
}