Я пытаюсь получить процент использования для данного диска в системе. Программа, которую я должен написать, будет скриптом оболочки 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 ответа2

0

Это должно работать для всех трех выходов 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+%) , перед которым стоит не жадный .+?).

0

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

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 .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .