Classificação do endereço IP de acordo com o segundo campo no arquivo

0

no meu script ksh eu preciso adicionar a seguinte tarefa (OS - linux / solaris)

Eu tenho o seguinte arquivo

 more test.txt


 /etc/backup/app 172.1.120      172.110.120 
 /etc/backup/app 172.1.120.12   172.110.120.98 
 /etc/backup/app 192.1.120      192.120.120 
 /etc/backup/app 172.1.120.1      172.110.120.7 
 /var/log/df     193.23.2       193.23.2
 /var/log/df     193.23.2.111   193.23.2.159

como localizar todos os IPs com 4 octetos no início do arquivo e, em seguida, os outros IPs com 3 octetos

Observação - os IPs de classificação serão de acordo com o segundo campo

Exemplo de arquivo solicitado (após ordenação)

    more test.txt

    /etc/backup/app 172.1.120.12   172.110.120.98 
    /etc/backup/app 172.1.120.1    172.110.120.7
    /var/log/df     193.23.2.111   193.23.2.159
    /etc/backup/app 172.1.120      172.110.120 
    /etc/backup/app 192.1.120      192.120.120 
    /var/log/df     193.23.2       193.23.2

A solução pode ser feita com ordenação ou ksh / awk / sed / perl um forro ... etc

    
por yael 08.04.2013 / 15:58

3 respostas

2

Contanto que você tenha GNU awk aqui é o one-liner que você precisa:

$ awk '{n=split($2,ip,".");if(n==4)print $0;else a[$2]=$0}END{n=asorti(a,b);for(i=1;i<=n;i++)print a[b[i]]}' file
/etc/backup/app 172.1.120.12   172.110.120.98 
/etc/backup/app 172.1.120.1    172.110.120.7 
/var/log/df     193.23.2.111   193.23.2.159
/etc/backup/app 172.1.120      172.110.120 
/etc/backup/app 192.1.120      192.120.120 
/var/log/df     193.23.2       193.23.2
    
por 09.04.2013 / 12:58
0
awk '{printf "%s.,%s\n", $2, $0}' | \
sed -E -e 's/^(([0-9]+\.){4}),/0.,/' -e 's/^(([0-9]+\.){3}),/1.,/' | \
sort -t. -k 1,1 -k 3,3 | \
sed -E -e 's/^[^,]+,//''

A ideia é:

  1. Copie o campo relevante para o início de cada linha e adicione um separador especial (vírgula, neste caso)
  2. Use sed para preceder algum valor que depende do número de octetos no endereço IP (usei 0 para 4 octetos e 1 para 3 octetos)
  3. Classifique os valores em campos relevantes
  4. Exclua tudo que adicionamos
por 08.04.2013 / 16:24
0
cat <(awk '{if($2~/[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*/){print $0}}' test.txt | sort -k 2) <(awk '{if($2~/^[0-9]*\.[0-9]*\.[0-9]*$/){print $0}}' test.txt | sort -k 2)
  • Linhas de correspondência em que o segundo campo tem 4 octetos e classifica
  • Linhas de correspondência onde o segundo campo termina após 3 octetos e classifica
  • Concatenar os dois resultados juntos
por 08.04.2013 / 16:35