Як захопити відсоток використання диска розділу як ціле число?


16

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

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

Use%
 83%

У такому випадку результат, який я хотів би, був би просто 83. Я не знаю жодних недоліків у використанні результатів df, але рада прийняти інші методи, на які не покладаються.


1
чому б просто не розібрати його?
Яків Влійм

1
Я також не бачу недоліку, ви можете видалити заголовок за допомогою df та | tr -dc '0-9'

Я виправлений, я не можу знайти перемикач для видалення заголовка з df.

Я прочитав сторінку man, та сторінку з інформацією, і не зміг її знайти ні @ bc2946088, гарний крик, щоб врахувати tr, я заводив голову в безлад з ідеями sed і awk.
Арронічний

3
Я також шукав варіант видалення заголовка. В основному розробники GNU неохоче реалізують це. Були запити на функції, і вони просто сказали "ні".
Сергій Колодяжний

Відповіді:


19

Я б скористався ...

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

Не впевнений, чи sed швидше, але я не можу пригадати значення sed.


1
Використовуючи timeдля тестування, він виявляється таким же швидким, як і sed.
Арронічний

4
@Arronical, якщо ваші результати не будуть більш ніж 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

Баш двоступеневе рішення

Минулого року, будучи певним шанувальником (Borne Again SHell), я подумав, що запропоную рішення використовувати його.

$ DF_PCT=$(df --output=pcent /mnt/d)
$ echo ${DF_PCT//[!0-9]/}
5
  • Рядок 1 фіксує dfвихід до змінної DF_PCT.
  • У рядку 2 знімається все, що не є цифрою, DF_PCTі відображається на екрані.
  • Перевагою над прийнятою відповіддю є подання рядка після відсотка ( 5у цьому випадку).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.