`Df -hl` से डिस्क उपयोग के प्रतिशत को कैसे प्रिंट करें


12

मुझे पता है कि df -hlमेरे सभी विभाजनों की एक सूची इसके आकार, एक प्रतिशत के रूप में उपयोग और स्थान उपलब्ध है।

अगर मैं उत्पादन सिर्फ आकार और का एक प्रतिशत के रूप में उपयोग करना चाहते थे sda2और sda3उदाहरण के लिए, मैं कैसे लिनक्स (Ubuntu) उन्हें जांच करने के लिए कहता हूं, उन्हें योग और उन्हें मेरे लिए दिखा सकता है?


1
नीचे दिए गए उत्तरों को सरल किया जा सकता है df कमांड को बदलकर जो वे डिस्क्स कमांड लाइन पर डिस्क्स को डालने के बजाय df कमांड लाइन पर डालते हैं। यानी df -HL / देव / sda [23]
mdpc

जवाबों:


11

के लिए dfcalculate योग करने के लिए, का उपयोग करें --totalsविकल्प। यदि आप केवल कुछ चुनिंदा ड्राइव पर योग चाहते हैं, तो उन्हें तर्क के रूप में निर्दिष्ट करें।

उदाहरण (और मेरे कंप्यूटर से आउटपुट)

यह सभी स्थानीय आरोहियों के लिए कुल है:

$ df --total -hl
Filesystem            Size  Used Avail Use% Mounted on
/dev/sdb1              14G   12G  2,1G  85% /
none                  490M  660K  489M   1% /dev
none                  497M  1,5M  495M   1% /dev/shm
none                  497M  260K  496M   1% /var/run
none                  497M     0  497M   0% /var/lock
/dev/sda1             3,7G  418M  3,3G  12% /fastdisk
total                  19G   12G  7,3G  62%

कुछ ड्राइव पर प्रतिबंध (ध्यान दें कि यदि निर्दिष्ट पथ एक सटीक माउंट बिंदु नहीं है, तो निकटतम माउंट बिंदु का उपयोग किया जाता है [अंत में नोट देखें] ):

$ df -hl --total /home /fastdisk
Filesystem            Size  Used Avail Use% Mounted on
/dev/sdb1              14G   12G  2,1G  85% /
/dev/sda1             3,7G  418M  3,3G  12% /fastdisk
total                  17G   12G  5,3G  69%

या devनाम का उपयोग कर :

$ df -hl --total /dev/sda1 /dev/sdb1
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1             3,7G  418M  3,3G  12% /fastdisk
/dev/sdb1              14G   12G  2,1G  85% /
total                  17G   12G  5,3G  69%

आगे अनुकूलन

यदि आप 'विशेष' को छोड़कर सभी आरोह को सूचीबद्ध करना चाहते हैं, तो आप -xविभाजन प्रकार से बाहर करने के विकल्प का उपयोग कर सकते हैं । ( -Tप्रकार दिखाने के लिए विकल्प का उपयोग करें ।)

व्यक्तिगत रूप से, इंटरैक्टिव उपयोग के लिए, मैं ~/.bash_aliases'गैर-भौतिक' आरोह को बाहर करने के लिए निम्नलिखित बैश उपनाम (जोड़ा गया ) का उपयोग करता हूं ।

alias df='df -h -x devtmpfs -x tmpfs -x debugfs'

ध्यान दें

माउंट पॉइंट्स के भीतर पथ निर्दिष्ट करने से कुछ समय के लिए अलग-अलग परिणाम प्राप्त हो सकते हैं जो माउंट पॉइंट पर सटीक पथ निर्दिष्ट करते हैं। उदाहरण के लिए, मेरे लैपटॉप पर मैं sshfsअपने (स्थानीय) फ़ाइल-सर्वर को माउंट करने के लिए उपयोग करता हूं।

df -h ~/.server-root/ ~/.server-root/disks/A ~/.server-root/disks/B
Filesystem            Size  Used Avail Use% Mounted on
johan@server:/        185G   58G  118G  33% /home/johan/.server-root
johan@server:/        1,9T  637G  1,2T  35% /home/johan/.server-root
johan@server:/        1,8T  1,1T  757G  59% /home/johan/.server-root

सर्वर रूट ( /) को माउंट किया गया है ~/.server-root। हालांकि, सर्वर पर, डिस्क चालू हैं /disks/*, जो df(लैपटॉप पर) के बारे में 'पता नहीं' है।

जाहिर है df, सर्वर पर विभिन्न माउंट पर डिस्क उपयोग सूचीबद्ध कर सकते हैं अगर उचित रास्तों दिया। हालाँकि, यह सभी पथों के लिए समान "फाइलसिस्टम" और "माउंटेड" दिखाता है, क्योंकि (मेरा मानना ​​है) कि sshfsस्थानीय कर्नेल माउंट टेबल में एकमात्र माउंट पॉइंट (इस माउंट से संबंधित ) है।


एक और बात: वास्तव में प्रश्न से संबंधित नहीं है, लेकिन प्रश्न के पिछले उत्तर से संबंधित है ।

awkस्क्रिप्ट (या समान) के साथ संख्याओं को जोड़ना , जैसे कुछ पहले पोस्ट किए गए उत्तर हैं, ध्वज का उपयोग करते समय एक अच्छा विचार नहीं है -h। ऐसा इसलिए है क्योंकि विशेष हैंडलिंग की आवश्यकता है। आप size+=$2;एक क्षेत्र के लिए नहीं कर सकते हैं जो 418Mएक पंक्ति में और 12Gदूसरे पर है और इससे कुछ उपयोगी मिलता है…

पैदावार में awkजोड़ने के साथ एक उदाहरण के 500Mलिए 10.2G

$ echo -e '500M\n10.2G' | awk '{size+=$1;} END{print size;}'
510.2

510.2 क्या?

यहाँ स्पष्ट रूप से एक समस्या है। तो, सिर्फ याद करने के लिए एक टिप के रूप में , जब df (और अन्य जो 'मानव पठनीय' संख्याओं का उपयोग कर सकते हैं ) के आउटपुट पर गणना (स्वचालित) करते हैं । सुनिश्चित करें कि आप ध्वज का उपयोग नहीं करते हैं -hऔर गणना स्क्रिप्ट का इनपुट इसके बजाय, सामान्यीकृत है (उदाहरण के लिए बाइट्स, ब्लॉक, KB या जो भी) और अंत में 'डिस्प्ले स्केलिंग' करें। अधिकांश स्क्रिप्टिंग और प्रोग्रामिंग भाषाओं में, कुछ को जोड़ना कठिन नहीं है:

If value < threshold Then
  print (value),"B"
Else If value < 1024*threshold Then
  print (value/1024),"kB"
Else If value < 1024*1024*threshold Then
  print (value/1024/1024),"MB"
(and so on...)

जहाँ मूल्य बाइट्स में होता है और थ्रेसहोल्ड 1000 के क्रम पर एक मान होता है। इस पद्धति का उत्थान यह है कि आप इसे आसानी से मुद्रित मानों (उपसर्ग को छोड़कर) को एक वांछित सीमा में और अपने कई महत्वपूर्ण अंकों के साथ आसानी से तैयार कर सकते हैं। चुनने। -hस्विच के साथ मानक उपयोगिताओं के मामले की तुलना में , जहां प्रारूप अक्सर तय होता है।

बेशक, इस गणना को अक्सर अधिक कुशल और / या सुरुचिपूर्ण बनाया जा सकता है, लेकिन यह उस विशिष्ट भाषा के लिए एक प्रश्न है जो इसमें लिखा गया है। फ्रैंकली, अगर यह एक उपयोगकर्ता स्क्रिप्ट में उपयोग किया जाता है जो केवल और फिर अंतःक्रियात्मक रूप से देखने के लिए चलाया जाता है। कुछ जानकारी, दक्षता वास्तव में एक चिंता का विषय नहीं है।


4

मुझे लगता है कि आप दोनों का योग चाहते थे sizeऔरuse%

 df -hl | grep 'sda2\|sda3' | awk 'BEGIN{print "Size","Use%"} {size+=$2;percent+=$5;} END{print size,percent}' | column -t

डिट्टो, ऊपर जैसा ही।
user32398

@ user32398: मतभेद हैं दोस्त।
प्रदीपचेत्री

इस सवाल के मेरे जवाब के अंत में मैंने इस सवाल पर एक सादगीपूर्ण अजीब-दृष्टिकोण (सिर्फ size+=$1) का उपयोग न करने के बारे में थोड़ा विस्तार से बताया । यह विधि वास्तव में के -hविकल्प के साथ संगत नहीं है df
जोहान ई

2

आप एक उपकरण का उपयोग करेंगे awk:

df -hl | awk '/^\/dev\/sd[ab]/ { sum+=$5 } END { print sum }'

कहाँ पे:

  • /^\/dev\/sd[ab]/केवल उन पंक्तियों को फ़िल्टर करने के लिए एक पैटर्न है जो इसके साथ शुरू होता है /dev/sdaया/dev/sdb
  • { sum+=$5 } उपरोक्त पैटर्न के किसी भी मैच के लिए पाँचवाँ क्षेत्र जोड़ें

आप Awk.info wikiawk पर कुछ उपयोगी संदर्भ पा सकते हैं ।


मुझे लगता है कि यह% को योग करने के लिए पर्याप्त नहीं है, लेकिन धन्यवाद मुझे विचार मिलता है।
user32398

1
sudo df -hl | grep 'mountdirname' | awk '{print $5}'

1
उन्होंने कहा कि के लिए कहा size, % usedऔर available। केवल% का उपयोग नहीं किया गया। इसके अलावा @mdpc के पास ड्राइव को एकल करने के लिए एक बेहतर तरीका है, लेकिन अगर आप मैच के लिए पैटर्न बनाना चाहते हैं तो वह यह कर सकता है:df -hl | awk '/sda2/{print $2,$5,$4}'
jesse_b

0

यदि आप इसे अलर्ट के साथ चाहते हैं, तो मैं इसे IFTTT, टेलीग्राम और वेबहूक के साथ करता हूं (जो सभी मुफ्त है)

#!/bin/bash
diskusage=$(df -H | grep -vE '^Filesystem|tmpfs|cdrom|mmcblk0p1' | awk '{ print $5 " " $1 }'| cut -f1 -d '%')
hostname=$(hostname)
tolerance=(85)
date=$(date)

if [[ "$diskusage" -gt "$tolerance" ]]
        then
        echo ""
        echo total disk usage is $diskusage%
        echo ""
        curl -X POST -H "Content-Type: application/json" -d '{"value1":"--Alert--","value2":"Total disk usage is '$diskusage'% ","value3":"Host information: '$hostname' "}' https://maker.ifttt.com/trigger/{alert}/with/key/PutYourKeyHEre
fi
echo ''
echo Disk usage is $diskusage%. The tolerance is $tolerance%. No alert fired $date
echo Disk usage is $diskusage%. The tolerance is $tolerance%. No alert fired $date >> /var/log/IFTTT/checkdiskspace.log
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.