Formatação AWK

1. Formatação AWK

Marcelo G Dias
mgdias

(usa Debian)

Enviado em 10/07/2018 - 15:18h

Pessoal,

Tenho um arquivo com a seguinte estrutura :
ASN,Empresa,IP4,IP6,TransitoBGP_IP4,TransitoBGP_IP6

Exemplo

ASN,Empresa,10.10.10.0/24,2804::4F1C::/32,10.10.11.0/24 - 88888 10.10.12.0/24 - 7777 6666, 2804::3F2C::/32 - 5555 2804::2F3C::/32 - 4444 3333

Observe que os campos são separados por virgula e nos campos $5 e $6 posso ter mais de um ASN após cada IP.

Precisava formatar da seguinte forma a saída :

ANS : Empresa
$1 : $2
Prefixo IPV4 : $3
Prefixo IPV6 : $4
Transito IPV4 :
$1 10.10.11.0/24 - 88888 (Primeira parte do $5)
$1 10.10.12.0/24 - 7777 6666 (Segunda parte do $5)
Transito IPV6 :
$1 2804::3F2C::/32 - 5555 (Primeira parte do $6)
$1 2804::2F3C::/32 - 4444 3333 (Segunda parte do $6)

Tanto os campos $5 e $6 podem ter mais de um parte a múltiplas partes a depender de quantos clientes estão atrás do ASN.

Realmente não consegui fazer esta formatação com o awk ...



  


2. Re: Formatação AWK

Paulo
paulo1205

(usa Ubuntu)

Enviado em 10/07/2018 - 18:25h

Uma vez que você tenha $5 e $6, salve-as em duas variáveis (por exemplo, transito_v4 e transito_v6). Você poderá então fazer laços de repetição que a separem em partes, usando uma pequena variação dessa mesma expressão regular.

Eu não sou fluente em awk, mas em Perl, que é fortemente inspirada no awk, ficaria mais ou menos assim.
    $transito_v4=$5;
$transito_v6=$6;

while($transito_v4=~/^(([0-9]+)(\.[0-9]+){0,3})(\/(0-9|[12][0-9]|3[012]))? - ((([0-9]+)( |$))+)(.*)/){
$ip=$1;
$prefix=defined($4)? $5: 32;
$asns=$6;
$transito_v4=$10;
print "CIDR $ip/$prefix: ";
while($asns=~/^ *([0-9]+) *(.*)$/){
$asns=$2;
print "ASN $1";
if(length($asns)>0){
print "; ";
}
}
print "\n";
}
if(length($transito_v4)>0){
print STDERR "lixo na especificação de transito: $transito_v4\n";
}
if(length($asns)>0){
print STDERR "lixo na especificação de ASN: $asns\n";
}


Você pode criar uma outra versão desse bloco (e da expressão regular) para a versão em IPv6.


3. Re: Formatação AWK

Mauriciodez
Mauriciodez

(usa Debian)

Enviado em 10/07/2018 - 20:34h

Velho ... com esse cenário aí o q deu para bolar foi, substituir os "prefixos" dos IP's por "quebra de linha" + "prefixo".

mauricio@phantom ~/$ echo "10.10.11.0/24 - 88888 10.10.12.0/24 - 7777 6666" | sed 's/10.10/\n10.10/g'

10.10.11.0/24 - 88888
10.10.12.0/24 - 7777 6666
mauricio@phantom ~/$


mauricio@phantom ~/$ echo "2804::3F2C::/32 - 5555 2804::2F3C::/32 - 4444 3333" | sed 's/2804:/\n2804:/g'

2804::3F2C::/32 - 5555
2804::2F3C::/32 - 4444 3333
mauricio@phantom ~/$


------------------------------------------| Linux User #621728 |----------------------------------------

" Nem sempre é amigo aquele que te tira do buraco !!! ( Saddam Hussein )"

------------------------------------------| Linux User #621728 |-----------------------------------------



4. Obrigado !!!

Marcelo G Dias
mgdias

(usa Debian)

Enviado em 11/07/2018 - 13:23h

Olá paulo1205, vou modificar o script que tinha feito com suas dicas, consegui fazer jogando a saída para o sed com uma ER ...

sed -r 's/(([0-9]{1,3}\.){3}[0-9]{1,3}\/[0-9]{1,2})/\n\t\1/g;s/(([0-9a-fA-F]{1,4}:){1,2}:\/[0-9]{1,2})/\n\t\1/g'

Com sua dica vou deixar apenas com o AWK ... vou ver como se comporta as ER nesta ferramenta de forma mais apropriada.

Agradeço a Mauriciodez também ...






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts