วิธีพิมพ์เปอร์เซ็นต์ของการใช้ดิสก์จาก `df -hl`


12

ฉันรู้ว่าจะdf -hlแสดงรายการพาร์ติชันทั้งหมดของฉันด้วยขนาดการใช้งานเป็นเปอร์เซ็นต์และพื้นที่ว่าง

ถ้าฉันต้องการส่งออกเพียงขนาดและการใช้งานเป็นเปอร์เซ็นต์sda2และsda3ตัวอย่างเช่นฉันจะบอก Linux (Ubuntu) เพื่อตรวจสอบพวกเขารวมพวกเขาและแสดงให้ฉันได้อย่างไร


1
คำตอบด้านล่างสามารถทำให้ง่ายขึ้นได้โดยการเปลี่ยนคำสั่ง df ที่ใช้เพื่อวางดิสก์บนบรรทัดคำสั่ง df แทนการแยกวิเคราะห์ผ่านดิสก์ทั้งหมด ie df -hl / dev / sda [23]
mdpc

คำตอบ:


11

สำหรับdfการคำนวณผลรวมใช้--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...)

โดยที่valueอยู่ในหน่วยไบต์และขีด จำกัดเป็นค่าตามลำดับ 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: มีความแตกต่างครับ
pradeepchhetri

ในตอนท้ายของคำตอบสำหรับคำถามนี้ฉันอธิบายเพิ่มเติมเล็กน้อยว่าทำไมไม่ใช้วิธี awk-simpleistic (เพียงsize+=$1) กับคำถามนี้ วิธีการนี้มันไม่เข้ากันได้กับตัวเลือกของ-h df
Johan E

2

คุณจะใช้เครื่องมือเช่นawk:

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

ที่ไหน:

  • /^\/dev\/sd[ab]/เป็นรูปแบบสำหรับการกรองเฉพาะบรรทัดที่ขึ้นต้นด้วย/dev/sdaหรือ/dev/sdb
  • { sum+=$5 } เพิ่มฟิลด์ที่ห้าสำหรับการแข่งขันใด ๆ ของรูปแบบข้างต้น

คุณสามารถค้นหาที่เป็นประโยชน์บางawkอ้างอิงในวิกิพีเดีย Awk.info


ฉันคิดว่ามันไม่เพียงพอที่จะรวม% แต่ขอบคุณฉันได้รับความคิด
user32398

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

1
เขาถามหาsize, และ% used availableไม่เพียง แต่ใช้% นอกจากนี้ @mdpc มีวิธีที่ดีกว่าสำหรับการแยกไดรฟ์ออกมา แต่ถ้าคุณต้องการจับคู่แบบ awk สามารถทำได้: df -hl | awk '/sda2/{print $2,$5,$4}'
jesse_b

0

หากคุณต้องการให้มีการแจ้งเตือนฉันจะใช้ IFTTT, Telegram และ WebHooks (ฟรีทั้งหมด)

#!/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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.