Selecione e classifique o endereço IP mantendo toda a linha

2

Portanto, preciso classificar os endereços IP e, depois, ordenar minha linha por eles.

Eu posso classificar endereços IP em um arquivo usando: sort -n -t . -k1,1 -k2,2 -k 3,3 -k4,4

Se meu arquivo se parece com:

    add method1 a.b.c.d other thing
    add method2 e.f.g.h other thing2
    add method2 a.b.c.d other thing2
    add method5 j.k.l.m other thing5
    add method3 a.b.c.d other thing3
    add method1 e.f.g.h other thing2

Mas, neste caso, o campo 1 será:

    add method1 a
    add method2 e
    add method2 a
    add method5 j
    add method3 a
    add method1 e

E o campo 4 será:

    d other thing
    h other thing2
    d other thing2
    m other thing5
    d other thing3
    h other thing2

Como e quais ferramentas devo usar para classificar meus endereços IP e, em seguida, classificar minhas linhas por eles. Agradecemos antecipadamente.

EDIT: Exemplo modificado. Há várias linhas com o mesmo endereço IP, mas com texto diferente e em ordem aleatória.

    
por Uhciar 28.08.2015 / 10:26

3 respostas

3

Este script copia o endereço IP do campo 3 usando o awk para o início da linha com um separador "%", então faz o tipo no endereço IP agora no primeiro campo, em seguida, remove a parte adicionada.

awk '{print $3 " % " $0}' |
sort -t. -n -k1,1 -k2,2 -k3,3 -k4,4 |
sed 's/[^%]*% //'

Se o campo com o endereço IP não for uma constante, você pode detectá-lo automaticamente em cada linha. Substitua o awk acima por:

awk '{ for(i=1;i<=NF;i++)
         if($i~/^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/)break;
       print $i " % " $0
     }' |
    
por 28.08.2015 / 11:03
5

Resposta tardia, mas pode ajudar alguém. Se você tem uma versão recente do GNU sort (de GNU coreutils 7.0 ou mais tarde), você pode usar o --version-sort (ou -V ), que fará a coisa certa com endereços IPv4. Assumindo a entrada de:

add method1 10.1.2.3 other thing
add method2 10.10.20.30 other thing2
add method2 10.1.2.3 other thing2
add method5 10.2.8.9 other thing5
add method3 10.1.2.3 other thing3
add method1 10.10.20.30 other thing2

Executar isso por sort -k 3 -V produzirá:

add method1 10.1.2.3 other thing
add method2 10.1.2.3 other thing2
add method3 10.1.2.3 other thing3
add method5 10.2.8.9 other thing5
add method1 10.10.20.30 other thing2
add method2 10.10.20.30 other thing2
    
por 28.08.2015 / 16:50
0

Espera-se que você entenda a opção -t ( man sort : field separator). O comando que você queria usar lida apenas com endereços IP simples .

Uma solução rápida e suja pode ser converter os espaços em pontos . do arquivo primeiro e depois ordenar (você pode querer desfazer a conversão mais tarde, excluindo os endereços IP)

sed -i.bak 's/ /./g' data.log
sort -n -t . -k2,2 -k3,3 -k4,4 -k5,5 data.log

Note que eu mudei os índices. Experimente.

    
por 28.08.2015 / 10:48

Tags