
Eu tenho um script que verifica o sistema de arquivos montado em relação à entrada listada em fstab. O problema que estou enfrentando aqui é manter a saída alinhada.
Abaixo está a saída do script:
/ 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
...
Quero manter essas linhas alinhadas para que fique assim:
/ 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
...
Eu tentei column e xargs sem conseguir obter o resultado desejado. Alguém poderia me ajudar com isso.
Responder1
Em geral, ao imprimir, você pode definir a largura da string de formato como printf
. %-20s
imprimiria uma string em um campo de 20 caracteres (*) de largura, a menos que estourasse. %-20.20s
daria 20 caracteres e eliminaria qualquer parte transbordante.
(* Embora, por exemplo, o Bash printf
realmente contebytes. A diferença pode ser vista com caracteres como ä
UTF-8.)
Então, por exemplo
printf "%-40s %s\n" "$mountpoint is mounted" "$status"
faria a primeira parte (pelo menos) com 40 caracteres de largura:
/was8/coreproduct is mounted OK
...
Ou, se precisar pós-processar uma entrada como essa, você pode usar Perl ou awk:
perl -pe 's/(.*) +(\S+)$/ sprintf "%-40s %s", $1, $2 /e' < file
awk '{s=$NF; sub(/ *[^ ]+ *$/, "", $0); printf "%-40s %s\n", $0, s}' < file
Ambos basicamente separam a última string sem espaço em branco e, em seguida, imprimem as duas partes com a primeira em um campo de largura fixa.
Ou, se você não se importa em manter a separação entre os campos exatamente como estavam, uma solução mais simples comentada pelo @JJoãoseria:
awk '{s=$NF; NF-- ; printf "%-40s %s\n", $0, s}' < file
Isso produz a saída abaixo. Observe que o espaço em branco anterior is mounted
é reduzido para um. Isso acontece porque awk
reconstrói o todo $0
quando NF
ou algum dos campos é modificado.
/was8/coreproduct is mounted OK
Responder2
Apenas um pouco ofuscante do Perl:
perl -ne 'printf "%-40s %s", /(.*) (.*)/s'
Responder3
Uma maneira é introduzir uma guia antes do código de status, por exemplo:
<input rev | sed 's/ /\t/' | rev | column -s $'\t' -t
Saída:
/ 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
/was8/ihs is mounted OK
/was8/backup is mounted OK
/was8/ihs/logs is mounted OK
/was8/wsdm is mounted OK
/was8/ws is mounted OK
/was8/ihs/logs/analysis is mounted OK
Responder4
Isso também pode ser feito facilmente com o utilitário de coluna. A chave é incluir algum tipo de marcador de diferenciação entre suas 'colunas'. Por exemplo, se o espaço for o marcador de diferenciação, column -s ' ' -o ' ' -t
o alinhamento será perfeito nos espaços.
Eu uso isso com frequência e até criei algumas macros vim interessantes que o utilizam para alinhar o código. A sintaxe geral que você deseja é:
column -s <Separator String> -o <Separator String in Output> -t
Esta é uma generalização da resposta baseada em guias, mas não requer necessariamente a inserção de guias.