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 diese Linie ausgerichtet halten, damit sie so aussieht:
/ 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 versucht, Spalte und Xargs nicht das gewünschte Ergebnis zu erhalten. Kann mir jemand dabei helfen.
text-processing
Kamal Asdeo
quelle
quelle
Antworten:
Im Allgemeinen können Sie beim Drucken die Breite in der Formatzeichenfolge auf festlegen
printf
.%-20s
würde eine Zeichenfolge in ein Feld mit einer Breite von 20 Zeichen (*) drucken , es sei denn, sie läuft über.%-20.20s
würde es 20 Zeichen machen und jeden überfüllten Teil fallen lassen.(* Obwohl zB Bashs
printf
tatsächlich Bytes zählen . Der Unterschied kann mit Zeichen wieä
in UTF-8 gesehen werden.)Also zB
würde den ersten Teil (mindestens) 40 Zeichen breit machen:
Wenn Sie eine solche Eingabe nachbearbeiten müssen, können Sie auch Perl oder awk verwenden:
Beide trennen im Grunde die letzte Nicht-Leerzeichen-Zeichenfolge und drucken dann die beiden Teile mit dem ersten auf ein Feld mit fester Breite.
Wenn Sie die Trennung zwischen den Feldern nicht genau so beibehalten möchten , wie sie waren, wäre eine einfachere Lösung, die von @ JJoao kommentiert wird :
Das erzeugt die folgende Ausgabe. Beachten Sie, dass das Leerzeichen mit zwei Leerzeichen zuvor
is mounted
auf eins reduziert ist. Dies geschieht, daawk
das Ganze neu erstellt wird,$0
wennNF
oder eines der Felder geändert wird.quelle
awk '{s=$NF; NF-- ; printf "%-40s %s\n", $0, s}'
is mounted
:) Wahrscheinlich eine gute Idee, das auf jeden Fall einzuschließen .printf "%.20s"
nur eine Zeichenfolge mit einer Breite von 20 Zeichen mitzsh
oder gedruckt wirdfish
printf
. Bei anderen Implementierungen ist es 20 Byte breit, wie es POSIX (unangemessen) erfordert.printf
Beachten Sie bei der integrierten Version von ksh93 auch,printf "%20Ls"
dass die Breite die Anzeigebreite ist (unter Berücksichtigung von Zeichen mit der Breite Null oder der doppelten Breite). Für awk wird YMMV je nach Implementierung mitperl
verwendet-Mopen=locale
, um mit Zeichen im Zeichensatz des Gebietsschemas zu arbeiten.Nur ein bisschen Perl verschleiern:
quelle
Eine Möglichkeit besteht darin, vor dem Statuscode eine Registerkarte einzufügen, z.
Ausgabe:
quelle
sed -Ee 's/(.*) +/\1\t/'
die letzten Leerzeichen durch die Registerkarte ersetzen. (Von hier gestohlen: unix.stackexchange.com/q/187889/170373 )sed 's/\(.*\) /\1\t/'
das, das" +"
immer nur einem Feld entspricht, da das vorhergehende.*
alle anderen gefressen hat.OK
. Der Hauptpunkt war der Versuch, dasrev
s zu vermeiden .Dies kann auch sehr einfach mit dem Spalten-Dienstprogramm durchgeführt werden. Der Schlüssel besteht darin, eine Art Unterscheidungsmarker zwischen Ihren 'Spalten' einzufügen. Wenn beispielsweise das Leerzeichen der Unterscheidungsmarker ist, werden die
column -s ' ' -o ' ' -t
Leerzeichen perfekt ausgerichtet.Ich benutze dies häufig und habe sogar einige nette Vim-Makros erstellt, die es zum Ausrichten von Code verwenden. Die allgemeine Syntax, die Sie möchten, lautet:
column -s <Separator String> -o <Separator String in Output> -t
Dies ist eine Verallgemeinerung der tabulatorbasierten Antwort, erfordert jedoch nicht unbedingt das Einfügen von Tabulatoren.
quelle
column
ist das?