So richten Sie mehrere Zeilen mit Echo oder Print aus

So richten Sie mehrere Zeilen mit Echo oder Print aus

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 printftatsä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 mountedauf eins reduziert wird. Dies geschieht, da awkdas Ganze neu aufgebaut wird $0, wenn NFeines 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 ' ' -terfolgt 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.

verwandte Informationen