*nix shellscript: получить использование диска в нескольких ОС

Я пытаюсь получить процент использования для данного диска в системе. Программа, которую я должен написать, будет bash сценарий оболочки. Скрипт должен работать на Debian, Arch и Mac OS X.

Мой текущий подход заключается в том, чтобы сделать df и grep для процента использования. Проблема в том, что выход df отличается на этих системах. Я хочу избежать if os==Arch elseif os == Debian…настолько далеко, насколько возможно.

Есть ли решение, которое позволяет избежать разграничения ОС?

Пример вывода для каждой операционной системы / версии df:

макинтош

Filesystem    512-blocks       Used Available Capacity   iused    ifree %iused  Mounted on
/dev/disk2     179032136  106162416  72357720    60%  13334300  9044715   72%   /

Debian

Filesystem    1K-blocks  Used     Available  %used Mounted on
/dev/hdv1       20480000 8423436  11016564   44%   /

арочный

Filesystem     1K-blocks   Used Available Use% Mounted on
/dev/root        5160576 813420   4085012  17% /

Так что Arch и Debian почти одинаковы. Также может быть проблемой то, что этикетки могут быть напечатаны на разных языках.

2 ответа

Решение

Это должно работать для всех трех df выходы:

df | awk '/\//{print $1,$(NF-1)}'

Это вывод каждого из опубликованных вами примеров:

/dev/disk2 72%
/dev/hdv1 44%
/dev/root 17%

ОБЪЯСНЕНИЕ:

awk Команда ищет строки, содержащие / (поэтому игнорирует заголовки) и печатает первый ($1) и предпоследний ($(NF-1)) поля. Если вы хотите только процент использования, сделайте это:

df | awk '/\//{print $(NF-1)}'

Обновить:

Мой ответ выше даст вам %iused поле на Mac df выход. Если вы хотите Capacity вместо этого сделайте это (снова работает на всех трех):

df | perl -ne '/\// && do {/(.+?)\s.+?(\d+%)/ && print "$1 $2\n"}'

который также печатает первое поле (не жадный (.+?), прекращено \s) и первое процентное число ((\d+%)предшествует не жадный .+?).

Немного грязнее, но, вероятно, более универсальное решение

df | sed -n 's/^\([^ ]*\) .*[^0-9]\([0-9]*%\).*/\1 \2/p'

который отображает первое "слово" в строке (имя устройства файловой системы), а затем ищет последовательность цифр, а затем %, В частности, он ищет последнюю такую ​​строку.

[Упс: также будет отображаться искаженное подмножество заголовка (т. Е. Первая строка с заголовками столбцов).]


Обновить:

df | sed -n 's/^\([^ ]*\) .*[^0-9]\([0-9][0-9]*%\).*/\1 \2/p'

исправляет ошибку в строке заголовка и

df | sed -n 's/^\([^ ]*\) [^%]*[^0-9]\([0-9][0-9]*%\).*/\1 \2/p'

захватывает первое поле процентного числа. В частности, на Mac это захватит Capacity столбец, а не %iused колонка.

Другие вопросы по тегам