Cara mencetak persentase penggunaan disk dari `df -hl`

12

Saya tahu bahwa df -hlmenampilkan daftar semua partisi saya dengan ukurannya, penggunaannya sebagai persentase, dan ruang yang tersedia.

Jika saya ingin menampilkan ukuran dan penggunaan hanya dalam persentase sda2dan sda3, misalnya, bagaimana saya bisa memberi tahu Linux (Ubuntu) untuk memeriksanya, jumlahkan dan perlihatkan kepada saya?

user32398
sumber
1
Jawaban di bawah ini dapat disederhanakan dengan mengubah perintah df yang mereka gunakan untuk meletakkan disk pada baris perintah df alih-alih mem-parsing semua disk. yaitu df -hl / dev / sda [23]
mdpc

Jawaban:

11

Untuk dfmenghitung total, gunakan --totalsopsi. Jika Anda ingin total hanya lebih dari beberapa drive pilih, tentukan sebagai argumen.

Contoh (dan output dari komputer saya)

Ini adalah total untuk semua pemasangan lokal:

$ 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%

Membatasi beberapa drive (perhatikan bahwa jika jalur yang ditentukan bukan titik pemasangan yang tepat, titik pemasangan yang mengandung paling dekat digunakan [lihat catatan di akhir] ):

$ 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%

atau menggunakan devnama:

$ 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%

Kustomisasi lebih lanjut

Jika Anda ingin membuat daftar semua mount kecuali yang 'spesial', Anda dapat menggunakan -xopsi untuk mengecualikan berdasarkan tipe partisi. (Gunakan -Topsi untuk menampilkan jenisnya.)

Secara pribadi, untuk penggunaan interaktif, saya menggunakan alias bash berikut (ditambahkan ke ~/.bash_aliases) untuk mengecualikan mount 'non-fisik'.

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

Catatan

Menentukan jalur dalam titik pemasangan kadang-kadang dapat menghasilkan hasil yang berbeda dengan menentukan jalur persis ke titik pemasangan. Sebagai contoh, pada laptop saya, saya menggunakan sshfsuntuk me-mount server file (lokal) saya.

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

Root server ( /) dipasang di ~/.server-root. Namun, di server, disk sudah terpasang /disks/*, yang df(pada laptop) tidak 'tahu' tentang.

Jelas dfdapat mendaftar penggunaan disk pada tunggangan yang berbeda di server, jika diberikan jalur yang tepat. Namun, ini menunjukkan "Filesystem" dan "Mounted on" yang sama untuk semua path, karena (saya percaya) itu adalah satu-satunya titik mount (terkait dengan sshfsmount ini ) di tabel mount kernel lokal.


Hal lain: Tidak benar-benar terkait dengan pertanyaan, tetapi terkait dengan jawaban sebelumnya untuk pertanyaan itu.

Menambahkan angka dengan awkskrip (atau yang serupa), seperti yang dilakukan beberapa jawaban yang diposting sebelumnya, bukan ide yang baik ketika menggunakan -hbendera. Ini karena penanganan khusus diperlukan. Anda tidak bisa hanya melakukan size+=$2;untuk bidang yang ada 418Mdi satu baris dan 12Gdi baris lain dan dapatkan sesuatu yang bermanfaat darinya ...

Sebagai contoh dengan awk, menambahkan 500Muntuk 10.2Ghasil

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

510.2 dari apa?

Jelas ada masalah di sini. Jadi, hanya sebagai tip untuk diingat , ketika melakukan perhitungan (otomatis) pada output df (dan lain-lain yang dapat menggunakan angka 'dapat dibaca manusia' ) . Pastikan Anda tidak menggunakan -hflag dan input ke skrip perhitungan dinormalisasi (misalnya menjadi byte, blok, KB, atau apa pun) dan lakukan 'penskalaan tampilan' di bagian akhir. Tidak sulit, di sebagian besar bahasa scripting dan pemrograman, untuk menambahkan sesuatu seperti:

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...)

di mana nilainya dalam byte dan ambang adalah nilai pada urutan 1000. Hasil dari metode ini adalah Anda dapat dengan mudah menyetelnya untuk menghasilkan nilai cetakan (tidak termasuk awalan) dalam rentang yang diinginkan dan dengan sejumlah digit signifikan untuk Anda memilih. Dibandingkan dengan casing dengan utilitas standar dengan -hsakelar, di mana formatnya sering diperbaiki.

Tentu saja, perhitungan ini seringkali dapat dibuat lebih efisien dan / atau elegan, tetapi itu adalah pertanyaan untuk bahasa spesifik yang digunakan. Terus terang, jika digunakan dalam skrip pengguna yang dijalankan hanya sekarang dan kemudian untuk melihat secara interaktif beberapa informasi, efisiensi sebenarnya bukan masalah.

Johan E
sumber
4

Saya pikir Anda menginginkan jumlah keduanya sizedanuse%

 df -hl | grep 'sda2\|sda3' | awk 'BEGIN{print "Size","Use%"} {size+=$2;percent+=$5;} END{print size,percent}' | column -t
pradeepchhetri
sumber
Ditto, sama seperti di atas.
user32398
@ user32398: Ada perbedaan Bung.
pradeepchhetri
Pada akhir jawaban saya untuk pertanyaan ini saya menguraikan sedikit tentang mengapa tidak menggunakan pendekatan awk-sederhana (hanya size+=$1) untuk pertanyaan ini. Metode ini benar-benar tidak kompatibel dengan -hopsi df.
Johan E
2

Anda akan menggunakan alat seperti awk:

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

Dimana:

  • /^\/dev\/sd[ab]/adalah pola untuk memfilter hanya garis yang dimulai dengan /dev/sdaatau/dev/sdb
  • { sum+=$5 } tambahkan bidang kelima untuk setiap kecocokan dari pola di atas

Anda dapat menemukan beberapa awkreferensi bermanfaat di wiki Awk.info .

jasonwryan
sumber
Saya pikir itu tidak cukup untuk menjumlahkan%, tapi terima kasih saya mendapatkan ide.
user32398
1
sudo df -hl | grep 'mountdirname' | awk '{print $5}'
sandeep
sumber
1
Dia meminta size, % used, dan available. Tidak hanya% yang digunakan. @Mdpc juga memiliki metode yang lebih baik untuk memilih drive, tetapi jika Anda ingin df -hl | awk '/sda2/{print $2,$5,$4}'
memetakan
0

Jika Anda menginginkannya dengan peringatan, saya melakukannya dengan IFTTT, Telegram Dan WebHooks (Yang semuanya gratis)

#!/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
pooley999
sumber