Ich kann es verwenden, stat
um eine ls-Ausgabe zu erstellen, die beide Formate der Berechtigungsinformationen anzeigt, was praktisch sein kann:
stat --printf="%A\t%a\t%h\t%U\t%G\t%s\t%.19y\t%n\n" . .*
drwxr-xr-x 755 4 boss boss 4096 2021-10-29 22:49:12 .
drwxr-xr-x 755 4 boss boss 4096 2021-10-29 22:49:12 .
drwxr-xr-x 755 36 boss boss 4096 2021-11-01 11:30:24 ..
-rw-r--r-- 644 1 boss boss 97708 2021-11-01 11:30:16 .custom
-rw-r--r-- 644 1 boss boss 4013 2021-10-11 22:04:04 .custom-dk
Der Abstand zwischen den Spalten \t
ist jedoch in Ordnung, aber recht „lückenhaft“. Das hat mich neugierig gemacht: Gibt es eine allgemeine Möglichkeit, Ausgaben wie diese nachzubearbeiten, sodass die Spalten den kleinsten gemeinsamen Nenner von Lücken von einem Leerzeichen haben, d. h. gibt es eine allgemeine Möglichkeit, das Obige mithilfe von awk
oder sed
oder Ähnlichem in etwas wie das Folgende anzupassen (ich richte auch nur die Zahlenspalten rechtsbündig aus, als „ideale“ Ausgabe, wenn das möglich ist)?
drwxr-xr-x 755 4 boss boss 4096 2021-10-29 22:49:12 .
drwxr-xr-x 755 4 boss boss 4096 2021-10-29 22:49:12 .
drwxr-xr-x 755 36 boss boss 4096 2021-11-01 11:30:24 ..
-rw-r--r-- 644 1 boss boss 97708 2021-11-01 11:30:16 .custom
-rw-r--r-- 644 1 boss boss 4013 2021-10-11 22:04:04 .custom-dk
Antwort1
Bezüglich „oder sed“ in Ihrer Frage: „sed“ ist das richtige Tool für einfache s/alt/neu/-Transformationen einzelner Zeichenfolgen, was Sie tun, ist jedoch nichts dergleichen und daher sollte „sed“ nicht einmal eine in Betracht zu ziehende Option sein.
Verwenden Sie einen 2-Pass-Ansatz, um zuerst die maximale Breite und Ausrichtung für jede Spalte zu bestimmen und diese dann beim Drucken zu verwenden. Verwenden Sie dazu ein beliebiges awk in einer beliebigen Shell auf jeder Unix-Box:
$ cat tst.awk
BEGIN { FS="\t" }
NR==FNR {
for (i=1; i<=NF; i++) {
align[i] = ( $i ~ /^[0-9]+$/ ? "" : "-" )
width[i] = ( length($i) > width[i] ? length($i) : width[i] )
}
next
}
{
for (i=1; i<NF; i++) {
printf "%" align[i] width[i] "s ", $i
}
print $NF
}
$ awk -f tst.awk file file
drwxr-xr-x 755 4 boss boss 4096 2021-10-29 22:49:12 .
drwxr-xr-x 755 4 boss boss 4096 2021-10-29 22:49:12 .
drwxr-xr-x 755 36 boss boss 4096 2021-11-01 11:30:24 ..
-rw-r--r-- 644 1 boss boss 97708 2021-11-01 11:30:16 .custom
-rw-r--r-- 644 1 boss boss 4013 2021-10-11 22:04:04 .custom-dk
Das Obige geht davon aus, dass Ihre letzte Spalte immer linksbündig ausgerichtet sein soll. Wenn das nicht der Fall ist, lassen Sie es uns wissen, da es in beiden Fällen nicht schwer zu handhaben ist. Es wird auch davon ausgegangen, dass die Ausrichtung einer Spalte durch die Werte (numerisch oder nicht) in den Feldern in der letzten Eingabezeile bestimmt werden kann.
Wenn die Eingabe aus einer Pipe statt aus einer Datei kommen muss (und Sie die Eingabe daher nicht zweimal öffnen können), können Sie die Eingabe in einem Array speichern und dieses im Abschnitt END ausgeben:
$ cat tst.awk
BEGIN { FS = "\t" }
{
for (i=1; i<=NF; i++) {
width[i] = ( length($i) > width[i] ? length($i) : width[i] )
align[i] = ( $i ~ /^[0-9]+$/ ? "" : "-" )
vals[NR,i] = $i
}
}
END {
for (n=1; n<=NR; n++) {
for (i=1; i<NF; i++) {
printf "%" align[i] width[i] "s ", vals[n,i]
}
print vals[n,NF]
}
}
und rufen Sie es dann so auf:
$ stat --printf="%A\t%a\t%h\t%U\t%G\t%s\t%.19y\t%n\n" . .* | awk -f tst.awk
Antwort2
Sie können verwenden column -t your_file
(aber es wird nicht der richtige Blocksatz angezeigt, soweit ich das beurteilen kann)
Ausgaben:
drwxr-xr-x 755 4 boss boss 4096 2021-10-29 22:49:12 .
drwxr-xr-x 755 4 boss boss 4096 2021-10-29 22:49:12 .
drwxr-xr-x 755 36 boss boss 4096 2021-11-01 11:30:24 ..
-rw-r--r-- 644 1 boss boss 97708 2021-11-01 11:30:16 .custom
-rw-r--r-- 644 1 boss boss 4013 2021-10-11 22:04:04 .custom-dk