Jak wydrukować procent wykorzystania dysku z `df -hl`

12

Wiem, że df -hlwyświetla listę wszystkich moich partycji wraz z ich rozmiarem, wykorzystaniem procentowym i dostępnym miejscem.

Jeśli chciałbym podać tylko rozmiar i użycie jako procent sda2i sda3, na przykład, jak mogę powiedzieć Linuksowi (Ubuntu), aby je sprawdził, zsumował i pokazał mi?

użytkownik32398
źródło
1
Poniższe odpowiedzi można uprościć, zmieniając polecenie df, którego używają, aby umieścić dyski w wierszu polecenia df zamiast analizować wszystkie dyski. tj. df -hl / dev / sda [23]
mdpc

Odpowiedzi:

11

Aby dfobliczyć sumy, użyj --totalsopcji. Jeśli chcesz, aby sumy były tylko dla niektórych wybranych dysków, podaj je jako argumenty.

Przykłady (i dane wyjściowe z mojego komputera)

Jest to suma dla wszystkich lokalnych montowań:

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

Ograniczenie do kilku dysków (zwróć uwagę, że jeśli podana ścieżka nie jest dokładnym punktem montowania, używany jest najbliższy zawierający punkt montowania [patrz uwaga na końcu] ):

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

lub używając devnazw:

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

Dalsze dostosowanie

Jeśli chcesz wyświetlić listę wszystkich montowań oprócz „specjalnych”, możesz użyć -xopcji wykluczania według typu partycji. (Użyj -Topcji, aby wyświetlić typy.)

Osobiście do celów interaktywnych używam następującego aliasu bash (dodanego do ~/.bash_aliases), aby wykluczyć montaże „niefizyczne”.

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

Uwaga

Określenie ścieżek w punktach podłączenia może czasem dać wyniki w innej formie, określając dokładną ścieżkę do punktu podłączenia. Na przykład na laptopie używam sshfsdo montowania (lokalnego) serwera plików.

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

Serwer root ( /) jest zamontowany na ~/.server-root. Jednak na serwerze dyski są montowane /disks/*, o których df(na laptopie) nie wiadomo.

Oczywiście dfmożna wymienić użycie dysku na różnych mocowaniach na serwerze, jeśli podano odpowiednie ścieżki. Pokazuje jednak ten sam „system plików” i „zamontowany” dla wszystkich ścieżek, ponieważ (uważam) jest to jedyny punkt montowania (związany z tym sshfsmontowaniem) w lokalnej tabeli montowania jądra.


Kolejna sprawa: nie bardzo związana z pytaniem, ale związana z poprzednią odpowiedzią na pytanie.

Sumowanie liczb za pomocą awkskryptu (lub podobnego), podobnie jak niektóre wcześniej opublikowane odpowiedzi, nie jest dobrym pomysłem podczas korzystania z -hflagi. Jest tak, ponieważ wymagana jest specjalna obsługa. Nie możesz po prostu zrobić size+=$2;dla pola, które jest 418Mw jednym rzędzie i 12Gw drugim, i uzyskać z niego coś pożytecznego…

Na przykład z awkdodawaniem 500Mdo 10.2Gwydajności

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

510,2 czego?

Tutaj jest wyraźnie problem. Tak więc, jako wskazówka do zapamiętania , kiedy wykonujemy (automatyczne) obliczenia na wyjściu df (i innych, które mogą używać liczb „czytelnych dla człowieka” ) . Upewnij się, że nie używasz -hflagi i że dane wejściowe do skryptu obliczeniowego są znormalizowane (na przykład do bajtów, bloków, KB itp.) I wykonaj „skalowanie wyświetlania” na końcu. W większości języków skryptowych i programowych nie jest trudno dodać coś takiego:

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

gdzie wartość jest w bajtach, a próg jest wartością rzędu 1000. Rezultatem tej metody jest to, że można ją łatwo dostroić, aby uzyskać wydrukowane wartości (z wyłączeniem prefiksu) w pożądanym zakresie i za pomocą szeregu znaczących cyfr wybierając W porównaniu do przypadku ze standardowymi narzędziami z -hprzełącznikami, w których format jest często ustalony.

Oczywiście obliczenia te często można uczynić bardziej wydajnymi i / lub eleganckimi, ale jest to pytanie dotyczące konkretnego języka, w którym jest napisany. Szczerze mówiąc, jeśli jest ono używane w skrypcie użytkownika uruchamianym tylko od czasu do czasu w celu interaktywnego przeglądania trochę informacji, wydajność tak naprawdę nie stanowi problemu.

Johan E.
źródło
4

Myślę, że chciałeś sumę obu sizeiuse%

 df -hl | grep 'sda2\|sda3' | awk 'BEGIN{print "Size","Use%"} {size+=$2;percent+=$5;} END{print size,percent}' | column -t
pradeepchhetri
źródło
To samo, jak wyżej.
user32398
@ user32398: Istnieją różnice, koleś.
pradeepchhetri
Na końcu mojej odpowiedzi na to pytanie nieco zastanowiłem się, dlaczego nie zastosować uproszczonego podejścia awk (tylko size+=$1) do tego pytania. Ta metoda naprawdę nie jest kompatybilna z -hopcją df.
Johan E
2

Użyłbyś narzędzia takiego jak awk:

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

Gdzie:

  • /^\/dev\/sd[ab]/to wzorzec do filtrowania tylko tych linii, które zaczynają się od /dev/sdalub/dev/sdb
  • { sum+=$5 } dodaj piąte pole dla dowolnych dopasowań powyższego wzoru

Przydatneawk odniesienia można znaleźć na wiki Awk.info .

jasonwryan
źródło
Myślę, że nie wystarczy zsumować%, ale dzięki wpadłem na pomysł.
user32398
1
sudo df -hl | grep 'mountdirname' | awk '{print $5}'
sandeep
źródło
1
Poprosił size, % usedoraz available. Nie tylko% wykorzystane. Również @mdpc ma lepszą metodę wyróżnienia dysku, ale jeśli chcesz df -hl | awk '/sda2/{print $2,$5,$4}'
wzorcować
0

Jeśli chcesz z alertami, robię to za pomocą IFTTT, Telegramu i WebHooks (które są bezpłatne)

#!/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
źródło