Jak uchwycić procent wykorzystania dysku partycji jako liczbę całkowitą?

16

Chciałbym, aby metoda przechwytywała użycie dysku przez określoną partycję za pomocą katalogu, w którym partycja jest zamontowana. Wyjście powinno być po prostu liczbą całkowitą bez dopełniania lub następujących po sobie symboli, ponieważ chciałbym zapisać go w zmiennej.

Użyłem df --output=pcent /mount/point, ale muszę przyciąć dane wyjściowe, ponieważ ma niepotrzebny nagłówek, pojedyncze wypełnienie spacją przed wartością i symbol% ​​następujący po tej wartości:

Use%
 83%

W tym przypadku chciałbym uzyskać wynik 83. Nie znam żadnych wad korzystania z danych wyjściowych df, ale chętnie akceptuję inne metody, które na nich nie polegają.

Arroniczny
źródło
1
dlaczego nie po prostu go przeanalizować?
Jacob Vlijm,
1
Nie widzę też wady, możesz usunąć nagłówek za pomocą df, a następnie | tr -dc '0-9'
Stoję poprawiony, nie mogę znaleźć przełącznika do usunięcia nagłówka z df.
Przeczytałem stronę podręcznika i stronę informacyjną i nie mogłem jej znaleźć @ bc2946088, dobry krzyk do rozważenia tr, wpadłem w bałagan z pomysłami sed i awk.
Arronical
3
Szukałem również usunięcia opcji nagłówka. Zasadniczo programiści GNU niechętnie go wdrażają. Pojawiły się prośby o dodanie funkcji, a oni po prostu powiedzieli „nie”.
Sergiy Kolodyazhnyy

Odpowiedzi:

19

Użyłbym ...

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

Nie jestem pewien, czy sed jest szybszy, ale nigdy nie pamiętam wartości sed.

muru
źródło
1
Korzystanie timeprzetestować to wychodzi jako tak szybko jak sed.
Arronical
4
@Arronical, chyba że wyniki są większe niż 100%, wątpię, czy zobaczysz dużą różnicę. : P
muru
@Arronical Co powiedział muru; czas wywołania prawdopodobnie będzie dominował.
CVn
1
W tym przypadku trjest łatwiejszy do odczytania niż sed.
Paddy Landau
7

Oto rozwiązanie awk:

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

Zasadniczo dzieje się tutaj to, że traktujemy znak „%” jako separator pól (separator kolumn) i drukujemy pierwszą kolumnę $ 1 tylko wtedy, gdy liczba rekordów jest równa dwóm ( NR==2część)

Gdybyśmy chcieli użyć bashtylko narzędzi, moglibyśmy zrobić coś takiego:

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

I dla zabawy, alternatywa sedpoprzez przechwytywanie grupy i -rdla rozszerzonego wyrażenia regularnego:

df --output=pcent | sed -nr '/[[:digit:]]/{s/[[:space:]]+([[:digit:]]+)%/\1/;p}'
Sergiy Kolodyazhnyy
źródło
6

sed rozwiązanie

df --output=pcent /mount/point | sed '1d;s/^ //;s/%//'
  • 1d usuń pierwszy wiersz
  • ; do oddzielania poleceń
  • s/^ // usuń spację z początku linii
  • s/%//usuń %znak
Zanna
źródło
6

Do potoku można grepwyodrębnić cyfry:

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

Zobacz na żywo:

$ echo "Use%
> 83%" | grep -o '[0-9]*'
83
fedorqui
źródło
1

Natknąłem się na serwer, na którym --output = pcent nie został jeszcze zaimplementowany, więc użyłem normalnego wyjścia, filtrowanego według kolumn, a następnie wyrażenia regularnego: df /mount/point | awk '{print $5}' | tr -dc '0-9'

Ramon Fincken
źródło
1
Powinieneś dodać -f lub --portability do df; w przeciwnym razie, jeśli / mount / point ma być za długi, spowoduje to przerwanie linii i otrzymanie złej wartości.
SvennD
1

Dwustopniowe rozwiązanie Bash

Będąc w pewnym sensie fanem bashu (Borne Again SHell) w zeszłym roku pomyślałem, że zaproponuję rozwiązanie wykorzystujące to.

$ DF_PCT=$(df --output=pcent /mnt/d)
$ echo ${DF_PCT//[!0-9]/}
5
  • Wiersz 1 przechwytuje dfdane wyjściowe do zmiennej DF_PCT.
  • Wiersz 2 usuwa wszystko, co nie jest cyfrą, DF_PCTi wyświetla je na ekranie.
  • Przewagą nad zaakceptowaną odpowiedzią jest przesunięcie wiersza po 5wygenerowaniu wartości procentowej ( w tym przypadku).
WinEunuuchs2Unix
źródło
1

Oto inne rozwiązanie:

df | grep /mount/point | awk '{ print $5 }' | cut -d'%' -f1
Feriman
źródło