printf e como adicionar pontos “…” entre variáveis e seus valores

4

Temos a seguinte saída

cat gh.log

 machine              status               
 =============================================================
 connection_ght 400
 pach_po 72
 timeout 311
 ping_agent 119675
 rt_machine 231
 ginco_snmp   14
 .
 .
 .
 .

Como imprimir a saída assim usando printf

 machine              status               
 =============================================================
 connection_ght..... 400
 pach_po............ 72
 timeout............ 311
 ping_agent......... 119675
 rt_machine......... 231
 ginco_snmp ........ 14
    
por jango 02.01.2018 / 17:02

1 resposta

7

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.

    
por 02.01.2018 / 17:11

Tags