Saída de script de shell formatada

6

Como posso corrigir a largura de saída usando printf ?

Este é um script de exemplo:

#!/bin/bash
OK=$(printf '\t%+50s\n' OK)
FAIL=$(printf '\t%+50s\n' FAIL)
for i in a aa aaa aaaa aaaaaa aaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa; do
        echo "$i $OK"
done

Saída:

a                                                       OK
aa                                                      OK
aaa                                                     OK
aaaa                                                    OK
aaaaaa                                                  OK
aaaaaaaaaaaaaaaaa                                                  OK
aaaaaaaaaaaaaaaaaaaaaaaaaa                                               OK

Eu quero algo como:

a                                                       OK
aa                                                      OK
aaa                                                     OK
aaaa                                                    OK
aaaaaa                                                  OK
aaaaaaaaaaaaaaaaa                                       OK
aaaaaaaaaaaaaaaaaaaaaaaaaa                              OK
    
por Leonardo Ortiz 19.06.2017 / 16:24

3 respostas

19

Uma maneira fácil:

canalize seu script para column -t

$ script.sh | column -t
a                           OK
aa                          OK
aaa                         OK
aaaa                        OK
aaaaaa                      OK
aaaaaaaaaaaaaaaaa           OK
aaaaaaaaaaaaaaaaaaaaaaaaaa  OK
    
por 19.06.2017 / 16:46
17

Use a seguinte abordagem printf para obter a saída necessária:

#!/bin/bash
for i in a aa aaa aaaa aaaaaa aaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa; do
    printf '%-50sOK\n' $i 
done

Saída de script:

a                                                 OK
aa                                                OK
aaa                                               OK
aaaa                                              OK
aaaaaa                                            OK
aaaaaaaaaaaaaaaaa                                 OK
aaaaaaaaaaaaaaaaaaaaaaaaaa                        OK
  • OK - conforme a string estática é movida para o FORMATO ( printf FORMAT [ARGUMENT] )

  • $i - considerado como printf argumento

por 19.06.2017 / 16:33
5

Você não usou uma ferramenta que formata a saída e, à medida que $i fica mais amplo, a saída não é alinhada.

Substituir

echo "$i $OK"

com

printf "%-50s %s\n" "$i" "$OK"

(substitua "foo" por string real).

onde

  • 50s é uma string de 50 caracteres de largura fixa,
  • - (menos) justifica à esquerda a string.
  • veja man 3 printf para detalhes sobre a string de formatação.
por 19.06.2017 / 16:33