Você pode tentar awk
:
$ awk -F . '$NF !~ /^0/' <file
129.130.100.100
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
Você pode tentar awk
:
$ awk -F . '$NF !~ /^0/' <file
129.130.100.100
$ awk -F'[./]' '($4+0) != 0' iplist
129.130.100.100
-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.
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:
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.
Tags grep text-processing