Wie erfasse ich den Prozentsatz der Festplattennutzung einer Partition als Ganzzahl?

16

Ich möchte eine Methode zum Erfassen der Festplattennutzung einer bestimmten Partition mithilfe des Verzeichnisses, in dem die Partition bereitgestellt ist. Die Ausgabe sollte nur eine Ganzzahl ohne Auffüllung oder folgende Symbole sein, da ich sie in einer Variablen speichern möchte.

Ich habe verwendet df --output=pcent /mount/point, aber ich muss die Ausgabe zuschneiden, da sie einen unnötigen Header, ein einfaches Leerzeichen vor dem Wert und ein% -Symbol nach dem Wert wie folgt hat:

Use%
 83%

In diesem Fall wäre die Ausgabe, die ich möchte, einfach 83. Ich kenne keine Nachteile bei der Verwendung der Ausgabe von df, bin aber froh, andere Methoden zu akzeptieren, die sich nicht darauf stützen.

Arronisch
quelle
1
warum nicht einfach analysieren?
Jacob Vlijm
1
Ich sehe auch keinen Nachteil, Sie können den Header mit df then | entfernen tr -dc '0-9'
Ich stehe korrigiert da, ich kann den Schalter zum Entfernen des Headers von df nicht finden.
Ich habe die Manpage und die Infoseite gelesen und konnte sie auch nicht finden @ bc2946088, gut zu bedenken tr, ich habe meinen Kopf durcheinander gebracht mit sed und awk Ideen.
Arronical
3
Ich habe auch versucht, die Header-Option zu entfernen. Grundsätzlich zögern GNU-Entwickler, dies umzusetzen. Es gab Feature-Anfragen und sie sagten nur nein.
Sergiy Kolodyazhnyy

Antworten:

19

Ich würde verwenden ...

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

Ich bin nicht sicher, ob sed schneller ist, aber ich kann mich nie an die sed-Werte erinnern.

muru
quelle
1
Beim timeTesten ist es genauso schnell wie sed.
Arronical
4
@Arronical Ich bezweifle, dass Sie einen großen Unterschied feststellen werden, es sei denn, Ihre Ausgaben sind waaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa mehr als 100%. : P
muru
@Arronical Was muru gesagt hat; Die Aufrufzeit wird wahrscheinlich dominieren.
ein Lebenslauf vom
1
In diesem Fall trist leichter zu lesen als sed.
Paddy Landau
7

Hier ist awk Lösung:

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

Grundsätzlich geschieht hier, dass wir das Zeichen '%' als Feldtrennzeichen (Spaltentrennzeichen) behandeln und die erste Spalte $ 1 nur dann ausgeben, wenn die Anzahl der Datensätze gleich zwei ist (der NR==2Teil).

Wenn wir bashnur Tools verwenden möchten, können wir Folgendes tun:

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

Und zum Spaß, alternativ sedvia Capture Group und -rfür erweiterten Regex:

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

sed Lösung

df --output=pcent /mount/point | sed '1d;s/^ //;s/%//'
  • 1d lösche die erste Zeile
  • ; Befehle zu trennen
  • s/^ // Entfernen Sie ein Leerzeichen vom Zeilenanfang
  • s/%//%Zeichen entfernen
Zanna
quelle
6

Sie können eine Pipe an eine senden, grepdie nur Ziffern extrahiert:

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

Sehen Sie es live:

$ echo "Use%
> 83%" | grep -o '[0-9]*'
83
fedorqui
quelle
1

Ich bin auf einen Server gestoßen, auf dem --output = pcent noch nicht implementiert war, also habe ich die normale Ausgabe verwendet, gefiltert nach Spalten, gefolgt von dem regulären Ausdruck: df /mount/point | awk '{print $5}' | tr -dc '0-9'

Ramon Fincken
quelle
1
Sie sollten -P oder --portability zu df hinzufügen. Wenn / mount / point zu lang ist, wird die Zeile umbrochen und Sie erhalten den falschen Wert.
Mittwoch,
1

Bash zweistufige Lösung

Als Fan von Borne Again SHell dachte ich letztes Jahr, ich würde eine Lösung dafür vorschlagen.

$ DF_PCT=$(df --output=pcent /mnt/d)
$ echo ${DF_PCT//[!0-9]/}
5
  • Zeile 1 erfasst die dfAusgabe in eine Variable DF_PCT.
  • Zeile 2 entfernt alles, was keine Ziffer ist, DF_PCTund zeigt es auf dem Bildschirm an.
  • Vorteil gegenüber akzeptierten Antworten ist der Zeilenvorschub, nachdem der Prozentsatz ( 5in diesem Fall) generiert wurde.
WinEunuuchs2Unix
quelle
1

Hier ist eine andere Lösung:

df | grep /mount/point | awk '{ print $5 }' | cut -d'%' -f1
Feriman
quelle