Eu 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 as colunas usa o \t
que é bom, mas bastante 'gappy'. 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
ou 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
Você pode usar
column -t your_file
(mas não obtém o bit justificado certo, até onde eu sei)Saídas:
Em relação a "ou sed" em 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 disso e, portanto, sed não deve ser uma opção para considerar.
Usando uma abordagem de 2 passos, primeiro para determinar a largura e o alinhamento máximos para cada coluna e depois usá-los ao imprimir, usando qualquer awk em qualquer shell em cada caixa Unix:
O acima assume que sua última coluna deve ser sempre alinhada à esquerda, se esse não for o caso, avise-nos, pois não é difícil de lidar de qualquer maneira. Também assume que o alinhamento de uma coluna pode ser determinado pelos valores (numéricos ou não) nos campos na última linha de entrada.
Se a entrada tiver que vir de um pipe em vez de um arquivo (e, portanto, você não pode abrir a entrada duas vezes), você poderá armazenar a entrada em um array e imprimir isso na seção END:
e depois chame como: