Adicione a linha de pontos à string que vai para printf
e tenha printf
em comprimento. No shell:
$ for x in a bbb cccccc ; do
printf '%.20s %s\n' "$x.................................." blah;
done
a................... blah
bbb................. blah
cccccc.............. blah
Em awk
:
$ printf "a 123\nbbbbbb 456\n" |
awk '{printf "%.20s %s\n", $1 ".....................", $2}'
a................... 123
bbbbbb.............. 456
Em %N.Ms
, N é a largura mínima para o campo, M no máximo.
Para converter o primeiro snippet para o segundo, você pode fazer algo assim:
$ awk 'NR <= 2 {print; next} {printf "%.20s %s\n", $1 ".....................", $2}' < gh.log
machine status
=============================================================
connection_ght...... 400
pach_po............. 72
etc.
A condição NR <= 2 {print; next}
passa as duas primeiras linhas através do as-is, o resto é convertido como acima. Note que isso pressupõe que não há outras colunas, etc. Adapte-se ao gosto.
printf
pode ter a largura do campo como um parâmetro separado, se você colocar um *
em seu lugar, também poderíamos fazer isso:
printf '%s%.*s %s\n' "$x" $(( 20 - ${#x} )) "................................" blah
( ${#x}
é o comprimento da variável x
.) Isso manteria a string e o filler separados, mas talvez seja um pouco pesado demais para shell ou awk
. Pode ser útil no código C, onde o gerenciamento de memória para manipulações de strings é mais irritante.