
In Ubuntu die Ausgabe dieses Befehls
df --exclude={tmpfs,devtmpfs,squashfs,overlay} | sed -e /^Filesystem/d | awk '{print $6 " " $1 " " $3 " " $4 " " $5}'
Ist:
/ /dev/mapper/dockerVG-rootLV 8110496 40591632 17%
/dockerssd /dev/mapper/ssdVG-ssdLV 214133656 274642488 44%
/dockerhdd /dev/mapper/hddVG-hddLV 83278236 1385191240 6%
/var/lib/docker /dev/mapper/hddVG-dockerLV 76046204 412729940 16%
Das ist, was ich brauche.
Unter CentOS 6 erhalte ich diese Ausgabe:
/dev/mapper/vg_rproxy-lv_root
51475068 43192316 12% /
/boot /dev/sda1 82688 379364 18%
/dev/mapper/vg_rproxy-lv_home
77349888 73119692 1% /home
Es ist ein Chaos.
Vollständige Ausgabe von CentOS 6:
$ df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/vg_rproxy-lv_root
51475068 5661336 43192292 12% /
tmpfs 957140 0 957140 0% /dev/shm
/dev/sda1 487652 82688 379364 18% /boot
/dev/mapper/vg_rproxy-lv_home
77349888 294352 73119692 1% /home
Was ist das Problem? Wie kann ich es beheben?
Antwort1
tl;dr
Verwenden df -P
.
Vollständige Antwort
/dev/mapper/vg_rproxy-lv_root
und /dev/mapper/vg_rproxy-lv_home
sind relativ lange Zeichenfolgen. Es erscheint df
in CentOSentscheidetum ihre Einträge auf zwei Zeilen aufzuteilen. Dadurch wird die Logik unterbrochen, wenn Sie die Ausgabe weiter analysieren möchten.
In schmalen Terminals kann dies eine gute Sache sein, da es trotz des begrenzten horizontalen Platzes eine halbspaltige, für Menschen lesbare Ausgabe erzeugt. Ich würde es vorziehen, wenn dies nicht passiert, wenn df
auf ein Nicht-TTY geschrieben wird (in Ihrem Fall eine Pipe).
Vielleicht df
in Ubuntu verhält es sich ähnlich, wenn Einträge in der Filesystem
Spalte lang sind; vielleicht ist Ihnen das einfach nicht aufgefallen, weil Ihre relativ kurz sind. Ich weiß nicht, das ist nicht wichtig. Wichtig ist, dass es sich um df
ein POSIX-Tool handelt und folgen solltedie Spezifikation. In der Spezifikation heißt es jedoch ausdrücklich:
Historische
df
Implementierungen unterscheiden sich erheblich in ihrer Standardausgabe. Daher war es notwendig, die Standardausgabe in einer lockeren Art und Weise zu beschreiben, um alle bekannten historischen Implementierungen zu berücksichtigen und eine portable Option (-P
) hinzuzufügen, um Informationen in einem portablen Format bereitzustellen.
Über die Option:
-P
Erstellen Sie die Ausgabe im im Abschnitt STDOUT beschriebenen Format.
Und schließlich der relevante Teil des STDOUT-Abschnitts (Hervorhebung von mir):
Die Implementierung kann den Abstand der Kopfzeile und der einzelnen Datenzeilen anpassen, sodass die Informationen in geordneten Spalten dargestellt werden.
Die verbleibende Ausgabemit
-P
besteht auseine Informationszeile für jedes angegebene Dateisystem. Diese Zeilen müssen wie folgt formatiert sein:"%s %d %d %d %d%% %s\n", <file system name>, <total space>, <space used>, <space free>, <percentage used>, <file system root>
Es ist also df
erlaubt, alles auszugeben, es sei denn, Sie verwenden -P
. Ohne können -P
einige Implementierungen von df
vorhersehbare und analysierbare Ausgaben erzeugen, andere … nicht so sehr. Ihr Verhalten kann gut genug dokumentiert sein oder auch nicht. Daher sollten Sie beim Analysieren der Ausgabe von im Allgemeinen df
immer verwenden -P
.
Das bloße Hinzufügen -P
reicht wahrscheinlich aus, um Ihr spezielles Problem zu beheben.
Hinweis: -P
regelt nur das Format. Die allgemeine POSIX-Spezifikation gilt nur im POSIX-Gebietsschema. Darüber hinaus df
neigen moderne Implementierungen dazu, standardmäßig 1024-Byte-Blöcke zu verwenden, während POSIX als Standard 512 angibt. In meinem Debian 10 df
von GNU coreutils greift auf den POSIX-Standard zurück, wenn POSIXLY_CORRECT
in der Umgebung festgelegt ist. Portabel können Sie 1024-Byte-Blöcke mit erzwingen -k
.
Dies ist ein portabler Befehl, der eine (fast) analysierbare Ausgabe erzeugt:
LC_ALL=POSIX df -Pk
Fast analysierbar, da die Einträge in der Filesystem
Spalte, glaube ich, Leerzeichen enthalten können, obwohl dies in einem vernünftig konfigurierten Betriebssystem nicht der Fall ist.
Sie können es weglassen LC_ALL=POSIX
und trotzdem die erwarteten Ergebnisse erhalten, aber im Allgemeinen sollte es für die Analyse vorhanden sein. Beispielsweise sed -e /^Filesystem/d
funktioniert Ihr in meinem polnischen Gebietsschema nicht, da ich von meinem einen polnischen Begriff für „Dateisystem“ erhalte df
. LC_ALL=POSIX
behebt dies. Trotzdem meinpersönlichEs ist vorzuziehen, sich nicht auf irgendetwas im Header zu verlassen. Ich würde sed 1d
oder verwenden tail -n +2
; oder die Aufgabe an delegieren awk
, da awk
sich bereits in Ihrer Pipeline befindet. Dies wäre:
LC_ALL=POSIX df -Pk --exclude={tmpfs,devtmpfs,squashfs,overlay} \
| awk 'NR>1 {print $6 " " $1 " " $3 " " $4 " " $5}'
Schließlich --exclude=
ist dies keine portable Option. Anscheinend funktioniert es für Sie in beiden fraglichen Systemen, es funktioniert jedoch möglicherweise nicht in anderen Systemen.