usa printf para formatar a saída de um array

4

Eu tenho uma matriz que contém detalhes sobre cada NIC. Cada índice de matriz consiste em três valores separados por espaço.

Eu gostaria de ter uma boa tabela como saída. Existe uma maneira de atribuir padrões de formatação a cada valor em um índice?

até agora, isso é o que eu uso:

NIC_details[0]='wlp2s0 192.168.1.221 xx:xx:xx:xx:xx:xx'
NIC_details[1]='wwan0 none xx:xx:xx:xx:xx:xx'
NIC_details[2]='virbr0 192.168.122.1 00:00:00:00:00:00'

printf "%-20s\n" "${NIC_details[@]}"

Existe uma maneira de acessar os valores em um índice de matriz por suas posições $ 1, $ 2 e $ 3, sabendo que eles são separados por espaço e, em seguida, aplicar um padrão de formatação para cada posição $ X?

Eu também tentei

echo "$i" | column -t

mas não traz o resultado desejado.

    
por caracal 18.04.2016 / 00:30

2 respostas

4

Aqui está uma pequena modificação para o que você já estava fazendo:

set -f # to prevent filename expansion
for i in ${!NIC_index[@]}
do
  printf "%-20s" ${NIC_details[i]}
  printf "\n"
done

Eu adicionei um loop for para passar por todos os índices da matriz - essa é a sintaxe ${!NIC... . Como é uma matriz numérica, você pode, alternativamente, fazer um loop diretamente sobre os índices.

Observe que eu intencionalmente deixei ${NIC_details[i]} sem aspas para que o shell dividisse o valor nos espaços que você usou para separar os valores. printf , portanto, vê os 3 valores e assim repete a formatação de% -20s para cada um deles. Em seguida, adiciono uma nova linha após cada NIC para criar uma boa tabela.

O set -f no topo é importante se deixarmos as variáveis sem aspas; caso contrário, o shell entrará e tentará glob todos os caracteres curinga que ele vê nas variáveis sem aspas.

Exemplo de saída:

wlp2s0              192.168.1.221       xx:xx:xx:xx:xx:xx
wwan0               none                xx:xx:xx:xx:xx:xx
virbr0              192.168.122.1       00:00:00:00:00:00
    
por 18.04.2016 / 03:17
1

Sim, existe uma maneira, use awk .
Um exemplo:

echo ${NIC[0]} | awk '{ printf "%-10s %s\n", $1, $2 }'

Outra maneira seria obter os valores em variáveis diferentes e, em seguida, fazer o printf do bash. Como:

var1=$(echo ${NIC[0]} | cut -d ' ' -f1)
var2=$(echo ${NIC[0]} | cut -d ' ' -f2)
var3=$(echo ${NIC[0]} | cut -d ' ' -f3)

E use o printf com $ var1,2,3.

    
por 18.04.2016 / 00:48