Como verificar se algum endereço IP está presente em um arquivo usando o shell script?

13

Eu tenho um script que gera alguma saída. Quero verificar essa saída para qualquer endereço IP, como

159.143.23.12
134.12.178.131
124.143.12.132

if (IPs are found in <file>)
then // bunch of actions //
else // bunch of actions //

A fgrep é uma boa ideia?

Eu tenho bash disponível.

    
por Koshur 18.07.2016 / 12:29

7 respostas

17

Sim, você tem muitas opções / ferramentas para usar. Eu apenas tentei isso, funciona:

ifconfig | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"

para que você possa usar grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" para obter os endereços IP da sua saída.

    
por 18.07.2016 / 12:34
2

começando minha resposta com base nesta resposta:

Yes , You have lot of options/tools to use. I just tried this , it works:

ifconfig | grep -oE "\b([0-9]{1,3}.){3}[0-9]{1,3}\b" a so you can use grep -oE "\b([0-9]{1,3}.){3}[0-9]{1,3}\b" to grep the ip addresses from your output.

e convertendo a resposta em tamanho completo IPv6, etc ...:

fgrep -oE "\b([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4}\b" -- file

se você quiser manter o / nnn se estiver lá:

fgrep -oE "\b([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4}(/[0-9]{1,3}){0,1}\b" -- file

e também há a versão abreviada do IPv6 que inclui '::'.

para mais respostas do IPv6, você pode procurar aqui: link

    
por 18.07.2016 / 21:50
2

Se o seu arquivo é chamado, por exemplo, ips , você pode escrever algo como:

while read -r ip
    do
        if [[ $ip == "$1" ]]; then
            shift
            printf '%s\n' 'action to take if match found'
        else
            printf '%s\n' 'action to take if match not found'
        fi
    done < ips

Então você pode passar os parâmetros conforme segue o script

./myscript 159.143.23.12 134.12.178.131 124.143.12.132 124.143.12.132
    
por 18.07.2016 / 12:42
0

Redirecionar essa saída para algum outputFile

Simplesmente grep com padrão como

grep -sE "159.143.23.12|134.12.178.131|124.143.12.132" <outputFile>
    
por 18.07.2016 / 12:34
0

Se você tiver a lista de IPs em um arquivo, um por linha, grep já tem a conveniente opção -f :

$ man fgrep | grep file= -A1
       -f FILE, --file=FILE
              Obtain patterns from FILE, one per line.  The empty file contains zero patterns, and therefore matches nothing.  (-f is specified by POSIX.)

Isso pode causar alguns falsos positivos devido a seqüências de caracteres, opcionalmente seguido por outro número para torná-lo um IP diferente. Muitas coisas que você pode fazer sobre isso, dependendo do seu caso, você pode ou não decidir se preocupar.

    
por 02.12.2016 / 02:24
0

Testado em SmartOS (uma variante do Solaris), esperamos que funcione em outros ambientes * nix:

egrep '(([0-9]|[0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])'

Exemplo:

$ cat >file.txt
IP1: 192.168.1.1
IP2: 261.480.201.311
IP3: 1012.680.921.3411

$ egrep '(([0-9]|[0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])' file.txt
IP1: 192.168.1.1

Esse padrão corresponde apenas ao válido IPv4, ou seja, x.x.x.x , em que x varia de 0 a 255. Se você precisar extrair apenas o IP correspondente, adicione uma opção -o ao comando acima. Você poderia incorporar este comando em um script bash e presumivelmente em outros scripts de shell também. E, se egrep falhar, try grep -E ...

Usando-o em um script de shell (bash):

ip=$(egrep -o '(([0-9]|[0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])' file.txt) echo $ip

    
por 31.08.2017 / 18:35
0

Acho que minha resposta para outro post é mais adequada aqui. Graças a este post e outros como ele eu vim com isso, que procura o formato IP correto, em seguida, se livrar de todas as linhas que contenham 256 ou superior. Substitua o IP por algo que não seja válido para não ver nenhuma saída:

echo '255.154.12.231' | grep -E '(([0-9]{1,3})\.){3}([0-9]{1,3}){1}' | grep -vE '25[6-9]|2[6-9][0-9]|[3-9][0-9][0-9]'

O primeiro grep provavelmente foi encontrado neste post e ele verifica qualquer número de 0-999 no formato X.X.X.X

O segundo grep remove linhas com números de 256 a 999, deixando assim apenas IPs de formato válidos, então eu pensei

MAS ... Como apontado pelo G-Man, eu estava errado ao assumir que o IP estaria em sua própria linha. Mais sempre, porém, haverá um espaço ou outro divisor para procurar em ambos os lados do IP. Os espaços / divisores podem ser removidos com sed ou outros meios após o IP ser encontrado. Eu também adicionei -o ao primeiro grep:

echo ' 1234.5.5.4321 ' | grep -Eo ' (([0-9]{1,3})\.){3}([0-9]{1,3}){1} ' | grep -vE '25[6-9]|2[6-9][0-9]|[3-9][0-9][0-9]' | sed 's/ //'

echo ' 234.5.5.432 ' | grep -Eo ' (([0-9]{1,3})\.){3}([0-9]{1,3}){1} ' | grep -vE '25[6-9]|2[6-9][0-9]|[3-9][0-9][0-9]' | sed 's/ //'

O primeiro não dará saída, enquanto o segundo e os espaços serão removidos.

    
por 05.04.2018 / 06:17