Wie kann ich unter „Verf“ die „173G“ greppen bzw. ausschneiden?
Ich brauche dies für Unix-Skripting in der Schule.
jonas@jonaspc:~/$ df -h /dev/sda2
Dateisystem Größe Benutzt Verf. Verw% Eingehängt auf
/dev/sda2 293G 121G 173G 42% /media/Windows
Antwort1
Die bequemste Lösung für eine solche Aufgabe ist awk
:
df -h /dev/sda2 | awk 'NR==2{print$4}'
Oder wenn mehrere Partitionen aufgelistet sind, können Sie die richtige Zeile anhand des Einhängepunkts auswählen:
df -h | awk '$1=="/dev/sda2"{print$4}'
Ist auch einfach mit sed
, aber weniger schön, wenn Sie es ein paar Mounts später debuggen müssen:
df -h /dev/sda2 | sed -rn '2s/^((\S+)\s+){4}.*/\2/p'
df -h | sed -rn '/^\/dev\/sda2/s/^((\S+)\s+){4}.*/\2/p'
Dies setzt voraus, dass die mit GNU sed
POSIX kompatible Syntax viele Escapezeichen enthält:
df -h /dev/sda2 | sed -n '2s/^\(\(\S\+\)\s\+\)\{4\}.*/\2/p'
df -h | sed -n '/^\/dev\/sda2/s/^\(\(\S\+\)\s\+\)\{4\}.*/\2/p'
Antwort2
Wenn Sie grep und cut verwenden müssen, können Sie Folgendes tun:
df -h /dev/sda2 | grep sda | cut -d" " -f14
Das ist aber ziemlich hässlich, da Sie die Leerzeichen zählen müssen (-f14) und der Grund dafür ist, dass @manatwork awk verwendet hat. Sie könnten tr
andere Tools verwenden, um es netter zu machen und das tatsächliche Feld angeben zu können, das Sie ausschneiden möchten:
df -h /dev/sda2 | grep sda | tr -s " " " " | cut -d" " -f4
Alternativ unterstützt das neuere Grep die Ausgabe nur einer teilweisen Übereinstimmung und Sie können dies in Kombination mit einem Bash-Trick verwenden:
df -h /dev/sda2 | grep -o '[^[:space:]]*G' | cut -d$'\n' -f3
Der reguläre Ausdruck könnte sicherer sein, dieser findet jedoch alle Größenfelder und gibt sie einzeln pro Zeile aus, während Cut das zweite auswählt.
Antwort3
Alle anderen Antworten hier sind großartig, aber wenn Sie verwendenSchlag, es ist nicht notwendig, externe Programme wie awk, sed, grep, cut usw. zu verwenden.
Die folgende Zeile bewirkt, was Sie möchten:
{ read; read -r _ _ _ av _; } < <(df -h /dev/sda1)
"$av"wird die verfügbare Größe auf /dev/sda1 sein
Wenn Sie nur den numerischen Teil verwenden möchten"$av"( z.B123in 123G ), können SieParametererweiterungum den irrelevanten Teil wie folgt zu kürzen:
ir="${av##*[0-9]}"; echo "${av%$ir}"
oder "${av%?}"
wenn Sie sicher sind, dass das Suffix von"$av"besteht nur aus einem Buchstaben.
Antwort4
grep
Wenn es nicht / sein muss cut
, können Sie die gleichen Informationen möglicherweise auch mit erhalten stat
. Im Dateisystemmodus %a
ist die Anzahl der freien Blöcke und %s
die Blockgröße, also %a * %s
der freie Speicherplatz in Bytes, und Sie können damit nach Belieben mathematische Berechnungen anstellen, um es in eine geeignetere Einheit Ihrer Wahl aufzuschlüsseln, zum Beispiel:
echo $((`stat -f -c "%a*%s" /media/windows/`/1024/1024/1024))GiB