Este script awk assume, talvez erroneamente, que os valores de saída estão em pares de valor de palavra-chave , por exemplo scope link
, com algumas exceções, como a primeira coluna, e a palavra-chave linkdown
. Acumula as colunas e dados e imprime o resultado:
awk '
{ i = 1; h = " ip"
hdr[h] = 1
col[h,NR] = $i
for(i=2;i<=NF;){
if($i=="linkdown"){extra[NR] = $i; i++; continue}
hdr[$i] = 1
col[$i,NR] = $(i+1)
i += 2
}
}
END{ #PROCINFO[sorted_in] = "@ind_str_asc"
n = asorti(hdr,x)
for(i=1;i<=n;i++){ h = x[i]; max[h] = length(h) }
for(j = 1;j<=NR;j++){
for(i=1;i<=n;i++){
h = x[i]
l = length(col[h,j])
if(l>max[h])max[h] = l
}
}
for(i=1;i<=n;i++){ h = x[i]; printf "%-*s ",max[h],h }
printf "\n"
for(j = 1;j<=NR;j++){
for(i=1;i<=n;i++){ h = x[i]; printf "%-*s ",max[h],col[h,j] }
printf "%s\n",extra[j]
}
}'
O resultado é maior que 80 colunas:
ip dev metric proto scope src via
default enp1s0 100 static 192.168.134.254
10.42.0.0/24 wlp2s0 600 kernel link 10.42.0.1
10.56.30.0/24 enx00133b0402c2 kernel link 10.56.30.143
169.254.0.0/16 wlp2s0 1000 link
192.168.57.0/24 vboxnet1 kernel link 192.168.57.1 linkdown
192.168.134.0/24 enp1s0 100 kernel link 192.168.134.142
O script usa a matriz associativa hdr
para manter as palavras-chave como elas são encontradas e a matriz bidimensional col
é indexada por essa palavra-chave e o número da linha para conter o valor. A primeira coluna é tratada especialmente com uma palavra-chave ip
inventada que possui um espaço inicial para garantir que ela seja classificada na primeira coluna. A matriz extra
observa a palavra-chave linkdown
lone.
No final dos dados, os cabeçalhos são classificados em uma matriz de indexação x
e percorremos todos os valores que encontram a largura máxima da coluna. Os cabeçalhos das colunas são então impressos e, em seguida, os dados salvos.