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


16

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

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

Use%
 83%

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


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

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в данном случае).

1

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

df | grep /mount/point | awk '{ print $5 }' | cut -d'%' -f1
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.