
Ich habe ein Skript, das das gemountete Dateisystem mit dem unter fstab aufgeführten Eintrag vergleicht. Das Problem, mit dem ich hier konfrontiert bin, besteht darin, die Ausgabe ausgerichtet zu halten.
Unten ist die Skriptausgabe:
/ is mounted OK
/boot is mounted OK
/was8 is mounted OK
/was8/slogs is mounted OK
/was8/cluster is mounted OK
/was8/working is mounted OK
/was8/app is mounted OK
/was8/tools is mounted OK
/was8/plugin is mounted OK
/was8/coreproduct is mounted OK
...
Ich möchte, dass diese Linien ausgerichtet bleiben, sodass sie folgendermaßen aussehen sollten:
/ is mounted OK
/boot is mounted OK
/was8 is mounted OK
/was8/slogs is mounted OK
/was8/cluster is mounted OK
/was8/working is mounted OK
/was8/app is mounted OK
/was8/tools is mounted OK
/was8/plugin is mounted OK
/was8/coreproduct is mounted OK
...
Ich habe es mit Spalten und Xargs versucht, konnte aber nicht das gewünschte Ergebnis erzielen. Kann mir jemand dabei helfen?
Antwort1
Im Allgemeinen können Sie beim Drucken die Breite in der Formatzeichenfolge auf setzen printf
. würde eine Zeichenfolge in einem 20 Zeichen (*)%-20s
breiten Feld drucken , sofern sie nicht überläuft. würde sie auf 20 Zeichen beschränken und alle überlaufenden Teile löschen.%-20.20s
(* Obwohl zB Bash's printf
tatsächlich zähltBytes. Der Unterschied ist bei Zeichen wie ä
in UTF-8 zu sehen.)
Also zB
printf "%-40s %s\n" "$mountpoint is mounted" "$status"
würde den ersten Teil (mindestens) 40 Zeichen breit machen:
/was8/coreproduct is mounted OK
...
Wenn Sie eine solche Eingabe nachbearbeiten müssen, können Sie auch Perl oder awk verwenden:
perl -pe 's/(.*) +(\S+)$/ sprintf "%-40s %s", $1, $2 /e' < file
awk '{s=$NF; sub(/ *[^ ]+ *$/, "", $0); printf "%-40s %s\n", $0, s}' < file
Beide trennen grundsätzlich die letzte Zeichenfolge ohne Leerzeichen und drucken dann die beiden Teile mit dem ersten in einem Feld mit fester Breite.
Oder, wenn es Ihnen nicht wichtig ist, die Trennung zwischen den Feldern genau so beizubehalten, wie sie war, gibt es eine einfachere Lösung, kommentiert mit @jjoaowäre:
awk '{s=$NF; NF-- ; printf "%-40s %s\n", $0, s}' < file
Das erzeugt die folgende Ausgabe. Beachten Sie, dass das Leerzeichen davor is mounted
auf eins reduziert wird. Dies geschieht, da awk
das Ganze neu aufgebaut wird $0
, wenn NF
eines der Felder geändert wird.
/was8/coreproduct is mounted OK
Antwort2
Nur ein bisschen Perl verschleiern:
perl -ne 'printf "%-40s %s", /(.*) (.*)/s'
Antwort3
Eine Möglichkeit besteht darin, vor dem Statuscode einen Tabulator einzufügen, zum Beispiel:
<input rev | sed 's/ /\t/' | rev | column -s $'\t' -t
Ausgabe:
/ is mounted OK
/boot is mounted OK
/was8 is mounted OK
/was8/slogs is mounted OK
/was8/cluster is mounted OK
/was8/working is mounted OK
/was8/app is mounted OK
/was8/tools is mounted OK
/was8/plugin is mounted OK
/was8/coreproduct is mounted OK
/was8/ihs is mounted OK
/was8/backup is mounted OK
/was8/ihs/logs is mounted OK
/was8/wsdm is mounted OK
/was8/ws is mounted OK
/was8/ihs/logs/analysis is mounted OK
Antwort4
Dies lässt sich auch ganz einfach mit dem Spalten-Hilfsprogramm erledigen. Der Schlüssel besteht darin, eine Art Unterscheidungsmarker zwischen Ihren „Spalten“ einzufügen. Wenn beispielsweise Leerzeichen der Unterscheidungsmarker sind, column -s ' ' -o ' ' -t
erfolgt eine perfekte Ausrichtung an Leerzeichen.
Ich verwende dies häufig und habe sogar einige nette Vim-Makros erstellt, die es zum Anpassen von Code verwenden. Die allgemeine Syntax, die Sie benötigen, lautet:
column -s <Separator String> -o <Separator String in Output> -t
Dies ist eine Verallgemeinerung der tabulatorbasierten Antwort, erfordert aber nicht unbedingt das Einfügen von Tabulatoren.