Как зафиксировать процент использования диска в разделе как целое число?

16

Я хотел бы метод, чтобы захватить использование диска конкретного раздела, используя каталог, где раздел монтируется. Вывод должен быть целым числом без дополнения или следующих символов, так как я хотел бы сохранить его в переменной.

Я использовал df --output=pcent /mount/point, но нужно обрезать вывод, так как он имеет ненужный заголовок, заполнение одним пробелом перед значением и символ% после значения следующим образом:

Use%
 83%

В этом случае вывод, который я хотел бы, был бы просто 83. Мне не известны какие-либо недостатки использования вывода df, но я рад принять другие методы, которые не полагаются на него.

Arronical
источник
1
почему бы просто не разобрать это?
Джейкоб Влейм
1
Я также не вижу недостатка, вы можете удалить заголовок с помощью df затем | tr-dc '0-9'
Я исправлен, я не могу найти переключатель для удаления заголовка из df.
Я читал справочную страницу и информационную страницу и тоже не мог ее найти. @ Bc2946088, неплохо бы подумать tr, у меня в голове беспорядок с идеями sed и awk.
Arronical
3
Я также искал вариант удаления заголовка. По сути, разработчики GNU не хотят его реализовывать. Были особые запросы, и они просто сказали нет.
Сергей Колодяжный

Ответы:

19

Я бы использовал ...

df --output=pcent /mount/point | tr -dc '0-9'

Не уверен, что sed быстрее, но я не могу вспомнить значения sed.

Мур
источник
1
Использование, timeчтобы проверить это так же быстро, как и седь.
Arronical
4
@ Arronical, если ваши результаты waaaaaaaaaaaay больше, чем 100%, я сомневаюсь, что вы увидите большую разницу. : P
Муру
@ Arronical Что сказал Муру; время вызова, вероятно, будет доминировать.
CVN
1
В этом случае trлегче читать, чем sed.
Пэдди Ландау
7

Вот решение awk:

$ df --output=pcent /mnt/HDD | awk -F'%' 'NR==2{print $1}'   
 37

В основном здесь происходит то, что мы рассматриваем символ «%» как разделитель полей (разделитель столбцов) и печатаем первый столбец $ 1 только тогда, когда количество записей равно двум ( NR==2часть)

Если бы мы хотели использовать только bashинструменты, мы могли бы сделать что-то вроде этого:

bash-4.3$ df --output=pcent / | while IFS= read -r line; do 
>     ((c++)); 
>     [ $c -eq 2 ] && echo "${line%\%*}" ;
> done
 74

И для забавы, альтернатива sedчерез группу захвата и -rдля расширенного регулярного выражения:

df --output=pcent | sed -nr '/[[:digit:]]/{s/[[:space:]]+([[:digit:]]+)%/\1/;p}'
Сергей Колодяжный
источник
6

sed решение

df --output=pcent /mount/point | sed '1d;s/^ //;s/%//'
  • 1d удалить первую строку
  • ; разделять команды
  • s/^ // убрать пробел из начала строк
  • s/%//удалить %знак
Занна
источник
6

Вы можете передать по каналу, grepкоторый просто извлекает цифры:

df --output=pcent /mount/point | grep -o '[0-9]*'

Смотрите это в прямом эфире:

$ echo "Use%
> 83%" | grep -o '[0-9]*'
83
fedorqui
источник
1

Я наткнулся на сервер, где --output = pcent еще не был реализован, поэтому я использовал обычный вывод, отфильтрованный по столбцу, а затем регулярное выражение: df /mount/point | awk '{print $5}' | tr -dc '0-9'

Рамон Финкен
источник
1
Вы должны добавить -P или --portability к df; иначе, если / mount / point слишком длинный, это приведет к разрыву строки, и вы получите неправильное значение.
SvennD
1

Баш двухступенчатое решение

Будучи чем-то вроде фаната bash (Borne Again SHell) в прошлом году, я думал, что предложу решение, используя его.

$ DF_PCT=$(df --output=pcent /mnt/d)
$ echo ${DF_PCT//[!0-9]/}
5
  • Строка 1 фиксирует dfвывод в переменную DF_PCT.
  • В строке 2 снимается все, что не является цифрой, DF_PCTи отображается на экране.
  • Преимущество перед принятым ответом заключается в переводе строки после получения процента ( 5в данном случае).
WinEunuuchs2Unix
источник
1

Вот еще одно решение:

df | grep /mount/point | awk '{ print $5 }' | cut -d'%' -f1
Feriman
источник