Posso usar stat
para criar uma saída ls que mostra os dois formatos de informações de permissão que podem ser úteis:
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
No entanto, o espaçamento entre colunas \t
é bom, mas bastante 'lacuna'. Isso me deixou curioso, existe uma maneira genérica de pós-processar quaisquer saídas como essa, de modo que as colunas fiquem no menor denominador comum de lacunas de um espaço, ou seja, existe uma maneira genérica de ajustar o acima para algo como o abaixo usando awk
ou sed
similar (também estou justificando à direita apenas as colunas numéricas como uma saída 'ideal', se isso for possível)?
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
Responder1
Com relação a "ou sed" na sua pergunta - sed é a ferramenta certa para usar para transformações simples s/old/new/ em strings individuais, o que você está fazendo não é nada parecido e então sed nem deveria ser uma opção para considerar.
Usando uma abordagem de 2 passagens, primeiro para determinar a largura máxima e o alinhamento de cada coluna e depois usá-los ao imprimir, usando qualquer awk em qualquer shell em cada caixa 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
O texto acima pressupõe que sua última coluna deve estar sempre alinhada à esquerda; se esse não for o caso, avise-nos, pois não é difícil lidar com isso de qualquer maneira. Também assume que o alinhamento de uma coluna pode ser determinado pelos valores (numéricos ou não) nos campos da última linha de entrada.
Se a entrada tiver que vir de um canal em vez de um arquivo (e você não pode abrir a entrada duas vezes), você pode armazenar a entrada em um array e imprimi-la na seção END:
$ 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]
}
}
e então chame-o como:
$ stat --printf="%A\t%a\t%h\t%U\t%G\t%s\t%.19y\t%n\n" . .* | awk -f tst.awk
Responder2
Você pode usar column -t your_file
(mas não obtém a parte justificada correta, até onde eu sei)
Saídas:
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