Sed: procura endereço IP entre o intervalo?

0

Como alguém procura um intervalo em endereços IP com sed ?

Por exemplo:

sed '/85.159.56/s/$/ ---  API SYSTEMS/'

Isso localizaria os endereços IP começando com: 85.159.56 e imprimindo próximo a ele: --- API SYSTEMS

O que eu tenho um intervalo para filtrar e não sei como aplicar um entre ou maior que em sed :

 sed '/192.200.160.0 - 192.200.191.255/s/$/ ---  APIv2 SYSTEMS/'
    
por Dave Hamilton 22.03.2016 / 18:16

2 respostas

1

Os intervalos numéricos são inadequados para expressões regulares, pois exigem expressões como

gsed '/192\.200\.1\([6-8][0-9]\|9[01]\)\./s/$/ --- APIv2 SYSTEMS/'

para corresponder entre 160 e 191, então, idealmente, você precisaria escrever um código que pudesse gerar a expressão, já que as chances de erro humano ao escrever ou modificar manualmente seriam extremamente altas. Uma solução melhor pode ser algo que compreenda endereços IP e suporte a notação CIDR, por ex. o módulo Perl NetAddr :: IP e, em seguida, analisar os endereços IP e verificar se eles são ->within some range analisada de outro lugar.

    
por 22.03.2016 / 20:16
1

Resposta Short'ish (sem SED)

Desculpe, mas isso é o melhor que eu poderia fazer em um de uma linha. Obviamente, não é SED.

perl -MNetAddr::IP -i.bak -nle '$re=NetAddr::IP->new("85.159.56.0/24")->re(); if(/$re/){ print $_ . " --- APIv2 SYSTEMS"}else{print}' yourfile.txt

O que faz

Isso levará a sub-rede "85.159.56.0/24" e a transformará em uma expressão regular. Em seguida, teste cada linha para essa expressão, se houver uma correspondência, ela adicionará "--- APIv2 SYSTEMS" ao final da sub-rede linha.

  • "- Mmodule" carrega um módulo antes de executar o código.
  • "- i.bak" significa que modificará o arquivo (yourfile.txt) no local e fará um backup como seu arquivo.txt.bak
  • "- n" faz com que o Perl faça um loop em torno do seu programa, o que faz com que seja iterado sobre os argumentos do nome do arquivo como sed -n ou awk
  • "- s" permite definir argumentos fora do programa
  • e "- -variable = X" é como definimos.
  • "- l" é porque sou preguiçoso, limpa a linha de entrada e acrescenta um retorno de carro a qualquer saída
  • finalmente "-e 'print" Eu sou um one-liner "' é o bit que contém o código

Apenas o REGEX

Se você quer apenas o regex (usado em grep ou sed / awk etc):

perl -MNetAddr::IP -lse 'print NetAddr::IP->new($range)->re()' -- -range=85.159.56.0/24

O que gera o seguinte se você estiver curioso:

(?:(?<![0-9])85\.159\.(?:56)\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?![0-9]))

Pré-requisito

Vale a pena notar que você pode precisar instalar o módulo NetAddr :: IP do cpan (eu uso o cpanm porque não tenho memória suficiente mas a sintaxe é a mesma:

sudo cpanm install NetAddr::IP

Comentário de encerramento

SED e AWK são ferramentas fantásticas, eu realmente tenho um par de livros sobre eles e tento usá-los quando necessário, no entanto Perl geralmente tem suas costas com sua gama de módulos e toda a coisa de uma linha. Tenho certeza que o Python também tem esse tipo de ferramenta, mas sou fã do Perl. Também posso recomendar apenas o link que uso com frequência para descobrir o que alguém me pediu para executar. Ele pega o comando e os vários switches / argumentos e apenas mostra a parte relevante das páginas man.

    
por 09.05.2016 / 23:17

Tags