Nur df-Zeilen anzeigen, die mehr fs als 80% verwenden

8
root@SERVER ~$ df
Filesystem  512-blocks  Free    %Used   Iused   %Iused  Mounted on
/dev/YXCV   655360      365632  45% 6322    13% /
/dev/ASDF   3801088     670648  83% 41759   32% /usr
/dev/ASR    1048576     500496  53% 5555    9%  /var

Wie kann ich die dfAusgabe des Befehls so weiterleiten, dass nur Zeilen angezeigt werden, die mehr als 80% nutzen?

zB: es würde nur anzeigen:

/dev/ASDF   3801088     670648  83% 41759   32% /usr
LanceBaynes
quelle

Antworten:

20

Angenommen, Sie haben keine Gerätenamen, die Leerzeichen enthalten (was beim Parsen der Ausgabe von problematisch ist df):

df -P | awk '0+$5 >= 80 {print}'

Passen Sie die Feldnummer an, wenn Sie das dfAusgabeformat Ihrer Implementierung anstelle des POSIX-Formats verwenden möchten .

Ohne das 0+wäre der Vergleich lexikalisch ( 9%wäre dann größer als 80). Durch die Verwendung des +binären arithmetischen Operator, zwingen wir $5(so in eine Zahl umgewandelt werden 9%wird 9) und dem Vergleich zu werden numerisch. Die Verwendung des + unären Operators (wie in awk '+$5 >= 80') funktioniert in einigen awkImplementierungen, jedoch nicht in herkömmlichen Implementierungen (die von A, W und K geschrieben wurden), in denen dieser Operator einfach ignoriert wird.

Gilles 'SO - hör auf böse zu sein'
quelle
df -P | awk '$5 >= 80 {print}'funktioniert für mich: können Sie einen Hinweis über den Nutzen der Verwendung der substrhinzufügen? Vielen Dank.
Jasonwryan
@jasonwryan: Ich habe mich nicht ohne weiteres daran erinnert, ob awk nachgestellte nicht numerische Zeichen ignoriert hat, als ich eine Zeichenfolge als Zahl interpretiert habe. Es ist also nicht erforderlich, das Trailing %explizit zu entfernen .
Gilles 'SO - hör auf böse zu sein'
1
'$5 >= 80 funktioniert, dh. Es ignoriert das Trailing %, < > ==funktioniert aber nicht auf die gleiche Weise ... während die (vorherige Bearbeitung) Subtring-Version für die meisten Vergleichssituationen zu funktionieren scheint , aber es schlägt auch fehl, wenn es mit < 100... verglichen wird. Ich denke, das liegt daran, dass es so ist eine Unter Vergleich Zeichenfolge ..
Peter.O
@fred: Oh, ich verstehe. Bei der numerischen Konvertierung wird ein nicht numerisches Suffix ignoriert, aber die Vergleichsoperatoren arbeiten mit Zeichenfolgen. Daher führt der Operator hier einen Zeichenfolgenvergleich durch, es sei denn, beide Zeichenfolgen sind numerisch. Der beste Weg ist, die Zeichenfolge auf eine Zahl zu zwingen (mit dem +Operator).
Gilles 'SO - hör auf böse zu sein'
Sieben Jahre später ... +1.
RonJohn
0

Nicht so elegant, funktioniert aber. Bitte ersetzen Sie ext4 durch Ihr eigenes fs (oder durch grep und bei vielen). Ersetzen Sie auch 10 durch Ihren eigenen Schwellenwert.

for fs in `cat /proc/mounts | grep ext4 | awk ' { print $2 }' | tr '\n' ' '` ;  do SPC=$( df $fs | awk 'END{ print $(NF-1) }' | sed 's/[^0-9]*//g' ) ; if [ $SPC -gt 10 ]; then  echo "$fs used more than 10";  fi done
Spike.WD
quelle
Dies ist nützlich, wenn Sie es in ein Skript integrieren müssen.
Spike.WD
-1

Ich stimme ddeimeke zu, aber diese Lösung funktioniert nur für 80 bis 89% und zeigt zum Beispiel nicht 93%.

Um dies zu tun (zum Beispiel> 70%):

df -k | egrep "([70,80,90][0-9]|100)%"
Anibal
quelle
Das wird nicht wie erwartet funktionieren. Meinten Sie egrep "([789][0-9]|100)%"?
Gegenmodus
-2
df | egrep "([89][0-9]|100)%"

wird den Trick machen.

ddeimeke
quelle
3
und was passiert, wenn ich 92% frei auf einem Mount-Punkt habe?
LanceBaynes
1
Es funktioniert gut für 92%; es funktioniert gut für 80 bis 100% ... Ich bin ziemlich verwirrt darüber, warum jemand es notiert hat ... vielleicht liegt es daran, dass meine dfAusgabe anders ist ... Aha! Ich habe gerade überprüft: Meine Standardausgabe zeigt nur Filesystem 1K-blocks Used Available Use% Mounted on... also hängt es nur davon ab, was Ihre Ausgabe ist (wie in Gilles Antwort erwähnt). Wenn es eine zweite %Spalte gibt (wie in der Frage), sollte ein Trailing .*%funktionieren: df | egrep "([89][0-9]|100)%.*%".. Jetzt verstehe ich, warum jemand
notiert hat