Puedo usarlo stat
para crear una salida ls que muestre ambos formatos de información de permisos, lo cual puede ser útil:
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
Sin embargo, el espacio entre columnas \t
está bien, pero es bastante "espacioso". Esto me hizo sentir curiosidad: ¿existe una forma genérica de posprocesar resultados como este de modo que las columnas estén en el mínimo común denominador de espacios de un espacio? Es decir, ¿existe una forma genérica de ajustar lo anterior a algo como lo siguiente? usando awk
o sed
o similar (también estoy justificando a la derecha solo las columnas numéricas como una salida "ideal", si es posible)?
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
Respuesta1
Con respecto a "o sed" en su pregunta: sed es la herramienta adecuada para usar en transformaciones simples s/old/new/ en cadenas individuales, lo que está haciendo no es nada de eso y, por lo tanto, sed ni siquiera debería ser una opción para considerar.
Usando un enfoque de 2 pasos, primero para determinar el ancho máximo y la alineación de cada columna y luego usarlos al imprimir, usando cualquier awk en cualquier shell en cada cuadro de Unix:
$ 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
Lo anterior supone que su última columna siempre estará alineada a la izquierda; si ese no es el caso, háganoslo saber, ya que no es difícil de manejar de cualquier manera. También supone que la alineación de una columna puede determinarse mediante los valores (numéricos o no) en los campos de la última línea de entrada.
Si la entrada tiene que provenir de una tubería en lugar de un archivo (por lo que no puede abrir la entrada dos veces), entonces puede almacenar la entrada en una matriz e imprimirla en la sección FINAL:
$ 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]
}
}
y luego llamarlo como:
$ stat --printf="%A\t%a\t%h\t%U\t%G\t%s\t%.19y\t%n\n" . .* | awk -f tst.awk
Respuesta2
Puedes usar column -t your_file
(pero, hasta donde yo sé, no obtiene el bit justificado correcto)
Salidas:
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