Come stampare la percentuale di utilizzo del disco da `df -hl`


12

So che df -hlgenera un elenco di tutte le mie partizioni con le sue dimensioni, l'utilizzo in percentuale e lo spazio disponibile.

Se volessi produrre solo le dimensioni e l'utilizzo in percentuale sda2e sda3, ad esempio, come potrei dire a Linux (Ubuntu) di controllarli, sommarli e mostrarmeli?


1
Le risposte di seguito potrebbero essere semplificate modificando il comando df che usano per mettere i dischi sulla riga di comando df invece di analizzare tutti i dischi. cioè df -hl / dev / sda [23]
mdpc

Risposte:


11

Per dfcalcolare i totali, utilizzare l' --totalsopzione. Se desideri i totali solo su alcune unità selezionate, specificali come argomenti.

Esempi (e output dal mio computer)

Questo è il totale per tutti i supporti locali:

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

Limitazione ad alcune unità (tenere presente che se il percorso specificato non è un punto di montaggio esatto, viene utilizzato il punto di montaggio contenente più vicino [vedere la nota alla fine] ):

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

o usando i devnomi:

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

Ulteriore personalizzazione

Se si desidera elencare tutti i montaggi tranne quelli "speciali", è possibile utilizzare l' -xopzione per escludere per tipo di partizione. (Usa l' -Topzione per mostrare i tipi.)

Personalmente, per uso interattivo, utilizzo il seguente alias bash (aggiunto a ~/.bash_aliases) per escludere i montaggi "non fisici".

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

Nota

La specifica dei percorsi all'interno dei punti di montaggio può a volte produrre risultati in forme diverse specificando il percorso esatto verso il punto di montaggio. Ad esempio, sul mio laptop utilizzo sshfsper montare il mio file-server (locale).

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

Il server root ( /) è montato su ~/.server-root. Tuttavia, sul server sono montati i dischi /disks/*che df(sul laptop) non "conoscono".

Evidentemente è dfpossibile elencare l'utilizzo del disco sui diversi montaggi sul server, se forniti i percorsi corretti. Tuttavia, mostra lo stesso "Filesystem" e "Montato su" per tutti i percorsi, poiché (credo) che sia l'unico punto di mount (relativo a questo sshfsmount) nella tabella di mount del kernel locale.


Un'altra cosa: non proprio correlato alla domanda, ma correlato a una precedente risposta alla domanda.

Aggiungere i numeri con uno awkscript (o simile), come fanno alcune risposte precedentemente pubblicate, non è una buona idea quando si usa il -hflag. Questo perché è richiesta una gestione speciale. Non puoi fare solo size+=$2;per un campo che si trova 418Msu una riga e 12Gsu un'altra e ottenere qualcosa di utile da esso ...

Per un esempio con awk, aggiungendo 500Mai 10.2Grendimenti

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

510.2 di cosa?

C'è chiaramente un problema qui. Quindi, proprio come un consiglio da ricordare , quando si fa un calcolo (automatizzato) sull'output di df (e altri che possono usare numeri 'leggibili dall'uomo' ) . Assicurarsi di non utilizzare il -hflag e che l'input per lo script di calcolo sia, invece, normalizzato (ad esempio byte, blocchi, KB o altro) ed eseguire il "ridimensionamento della visualizzazione" alla fine. Non è difficile, nella maggior parte dei linguaggi di programmazione e di scripting, aggiungere qualcosa come:

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

dove valore è in byte e soglia è un valore dell'ordine di 1000. Il risultato di questo metodo è che puoi facilmente sintonizzarlo per produrre valori stampati (escluso il prefisso) in un intervallo desiderato e con un numero di cifre significative per il tuo la scelta. Rispetto al caso con utility standard con -hswitch, in cui il formato è spesso fisso.

Naturalmente, questo calcolo può spesso essere reso più efficiente e / o elegante, ma questa è una domanda per la lingua specifica in cui è scritto. Francamente, se viene utilizzato in uno script utente che viene eseguito solo di tanto in tanto per visualizzare interattivamente alcune informazioni, l'efficienza non è davvero una preoccupazione.


4

Penso che tu abbia voluto la somma di entrambi sizeeuse%

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

Idem, come sopra.
user32398,

@ user32398: ci sono differenze amico.
pradeepchhetri,

Alla fine della mia risposta a questa domanda ho spiegato un po 'perché non usare un approccio awk semplicistico (giusto size+=$1) a questa domanda. Questo metodo non è realmente compatibile con l' -hopzione di df.
Johan E,

2

Utilizzeresti uno strumento come awk:

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

Dove:

  • /^\/dev\/sd[ab]/è un modello per filtrare solo quelle righe che iniziano con /dev/sdao/dev/sdb
  • { sum+=$5 } aggiungi il quinto campo per qualsiasi corrispondenza del modello sopra

Puoi trovare alcuni awkriferimenti utili sul wiki Awk.info .


Penso che non sia sufficiente sommare la%, ma grazie ho avuto l'idea.
user32398

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

1
Ha chiesto size, % usede available. Non solo% utilizzato. Anche @mdpc ha un metodo migliore per individuare l'unità, ma se si desidera eseguire il pattern match di awk è possibile farlo: df -hl | awk '/sda2/{print $2,$5,$4}'
jesse_b

0

Se lo volevi con avvisi, lo faccio con IFTTT, Telegram e WebHooks (che è tutto gratuito)

#!/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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.