cut / grep und df -h

cut / grep und df -h

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 sedPOSIX 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 trandere 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

grepWenn es nicht / sein muss cut, können Sie die gleichen Informationen möglicherweise auch mit erhalten stat. Im Dateisystemmodus %aist die Anzahl der freien Blöcke und %sdie Blockgröße, also %a * %sder 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

verwandte Informationen