Nicht das gleiche Ausgabeformat von `df` in verschiedenen Linux-Distributionen

Nicht das gleiche Ausgabeformat von `df` in verschiedenen Linux-Distributionen

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_rootund /dev/mapper/vg_rproxy-lv_homesind relativ lange Zeichenfolgen. Es erscheint dfin 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 dfauf ein Nicht-TTY geschrieben wird (in Ihrem Fall eine Pipe).

Vielleicht dfin Ubuntu verhält es sich ähnlich, wenn Einträge in der FilesystemSpalte 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 dfein POSIX-Tool handelt und folgen solltedie Spezifikation. In der Spezifikation heißt es jedoch ausdrücklich:

Historische dfImplementierungen 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-Pbesteht 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 dferlaubt, alles auszugeben, es sei denn, Sie verwenden -P. Ohne können -Peinige Implementierungen von dfvorhersehbare 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 dfimmer verwenden -P.

Das bloße Hinzufügen -Preicht wahrscheinlich aus, um Ihr spezielles Problem zu beheben.

Hinweis: -Pregelt nur das Format. Die allgemeine POSIX-Spezifikation gilt nur im POSIX-Gebietsschema. Darüber hinaus dfneigen moderne Implementierungen dazu, standardmäßig 1024-Byte-Blöcke zu verwenden, während POSIX als Standard 512 angibt. In meinem Debian 10 dfvon GNU coreutils greift auf den POSIX-Standard zurück, wenn POSIXLY_CORRECTin 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 FilesystemSpalte, 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=POSIXund trotzdem die erwarteten Ergebnisse erhalten, aber im Allgemeinen sollte es für die Analyse vorhanden sein. Beispielsweise sed -e /^Filesystem/dfunktioniert Ihr in meinem polnischen Gebietsschema nicht, da ich von meinem einen polnischen Begriff für „Dateisystem“ erhalte df. LC_ALL=POSIXbehebt dies. Trotzdem meinpersönlichEs ist vorzuziehen, sich nicht auf irgendetwas im Header zu verlassen. Ich würde sed 1doder verwenden tail -n +2; oder die Aufgabe an delegieren awk, da awksich 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.

verwandte Informationen