Как вывести процент использования диска из `df -hl`


12

Я знаю, что df -hlвыводит список всех моих разделов с его размером, использованием в процентах и ​​доступным пространством.

Если я хочу вывести только размер и использование в процентах sda2и sda3, например, как я могу сказать Linux (Ubuntu) проверить их, суммировать и показать их мне?


1
Приведенные ниже ответы можно упростить, изменив команду df, которую они используют для помещения дисков в командную строку df, вместо анализа всех дисков. т.е. 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 (добавлен в ~/.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флаг и что вместо этого нормализован ввод данных в сценарий расчета (например, в байтах, блоках, килобайтах или что-либо еще) и выполните «масштабирование отображения» в конце. В большинстве языков сценариев и языков программирования нетрудно добавить что-то вроде:

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: Есть различия, чувак.
pradeepchhetri

В конце моего ответа на этот вопрос я немного пояснил, почему бы не использовать упрощенный awk-подход (просто size+=$1) к этому вопросу. Этот метод действительно не совместим с -hопцией df.
Йохан 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.