grep para IP sem último octeto como 0 [duplicado]

0

Estou tentando extrair IPs de várias listas geradas pela Web e preciso isolar aqueles que não terminam com 0.

Por exemplo, na lista abaixo, ele tem texto, IPs regulares e intervalos de IP. O que estou tentando fazer é obter apenas IPs regulares e não qualquer coisa que termine em um 0 ou em uma máscara de sub-rede:

; Spamhaus DROP List 2016/07/03 - (c) 2016 The Spamhaus Project
; http://www.spamhaus.org/drop/drop.txt
; Last-Modified: Sun,  3 Jul 2016 21:18:32 GMT
; Expires: Sun, 03 Jul 2016 23:26:45 GMT

1.0.1.0/24
223.223.176.0
129.130.100.100
1.160.118.30

Se eu executar grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'

isso me dá:

1.0.1.0
223.223.176.0
129.130.100.100
1.160.118.30

Eu tentei substituir a última parte do regex como:

grep -Eo '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[^1-255]'

mas não funciona.

Estou tentando minimizar o uso de vários greps canalizados (ou sed / awk) para acelerar o processo de pesquisa. Por exemplo, o que eu espero evitar é:

grep <all IPs from list> | grep -v <all those that end in 0 or subnet> 

É possível usar o grep / sed / awk em uma única linha para obter esses IPs? No exemplo acima, o resultado deve ser:

129.130.100.100
1.160.118.30

Obrigado

    
por Dave 05.07.2016 / 07:21

3 respostas

1

Você pode tentar awk :

$ awk -F . '$NF !~ /^0/' <file
129.130.100.100
    
por 05.07.2016 / 07:26
1

Resposta para a versão original da pergunta

$ awk -F'[./]' '($4+0) != 0' iplist
129.130.100.100

Como funciona

  • -F'[./]'

    Isso define o separador de campo como . ou / . Desta forma, o último octeto será sempre o campo 4.

  • ($4+0) != 0

    Esta condição lógica é avaliada como verdadeira se o quarto octeto é não 0. Como não incluímos nenhuma ação explícita para essa condição, o awk executa a ação padrão que é imprimir a linha.

    Adicionamos 0 ao quarto campo apenas para garantir que o awk esteja executando uma comparação numérica, não uma comparação de string.

por 05.07.2016 / 07:49
0
grep -E '^([0-9]{1,3}\.){3}[1-9][0-9]{0,2}$'

[1-9] verifica se o primeiro dígito do último octeto é diferente de zero - os dígitos opcionais seguintes significam que você ainda pode corresponder zeros posteriores ( 129.130.100.100 ).

$ garante que a linha termine após o último octeto, por isso não corresponderá a nada com uma máscara de sub-rede.

Seu [^1-255] não faz o que você deseja por alguns motivos:

  • Ele manipula caracteres, não números: significa "(entre 1 e 2 ) OR 5 OR 5 "
  • ^ significa " não neste intervalo"

Portanto, exclui tudo cujo último octeto começa com 1, 2 ou 5 e corresponde ao restante.

    
por 05.07.2016 / 12:25