*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
колонка.