grep -E-f para capturar endereços IP correspondentes em dois arquivos e, imprimir ou fazer o eco do resultado de cada iteração, xx.xx.xx.xx encontrado ou xx.xx.xx.xx não encontrado

2

Tendo uma pequena lista de algumas centenas de endereços IP em file1 e deseja identificar se algum desses endereços IP está faltando na lista principal, file2 . Procurando por uma saída > redirecionar para um arquivo que imprime resultado de ambos os casos, como:

xx.xx.xx.xx missing
xx.xx.xx.xx found

Já analisei meia dúzia de perguntas semelhantes e aprendi muito, mas nenhuma das perguntas existentes responde ao meu problema, então criei meu próprio Q.

Eu tentei algumas abordagens usando awk , bem como grep -F -f , mas tendo problemas para reconciliar o resultado da comparação e construindo a declaração lógica.

Já analisei meia dúzia de respostas existentes e aprendi muito, mas nenhuma abordou meu objetivo da maneira que eu entendi.

    
por user2793091 13.11.2015 / 06:32

2 respostas

1

Com um loop while:

while IFS= read -r i; do
  grep -Fq "$i" file && echo "$i found" || echo "$i missing"
done <ip_addresses
  • while faz um loop por cada linha no arquivo ip_addresses
    • grep -Fq procura por linhas contendo correspondências da sequência fixa ( -F ), que o ponto não corresponde a nenhum caractere. O -q flag força grep a imprimir nada.
    • && echo "$i found" if grep sucede que o endereço foi encontrado.
    • || echo "$i missing" se não, está faltando
por 13.11.2015 / 07:39
0

Suponha que o arquivo l1 seja a lista com os endereços IP desconhecidos e o arquivo l2 seja a lista principal.

Os itens a seguir listarão todos os endereços IP que estão apenas em l1 e não em l2 :

egrep -v "'cat l2|xargs -I {} echo -n '|{}'|sed -e 's/^|//''" l1

Se você remover a opção -v , ela listará todos os endereços IP que ocorrem em l1 e l2 :

egrep "'cat l2|xargs -I {} echo -n '|{}'|sed -e 's/^|//''" l1

Ambos os arquivos l1 e l2 devem estar no mesmo formato.

O seguinte comando:

cat l2|xargs -I {} echo -n '|{}'|sed -e 's/^|//'

cria uma lista de endereços IP, separados por | , do conteúdo do arquivo l2 . O | é o caractere or para o regex passado para egrep .

Testado com arquivos:

$ cat l1
192.168.0.10
192.168.2.14
192.168.0.11
192.168.0.9

$ cat l2
10.64.10.200
192.168.4.0
192.168.2.3
192.168.0.10
192.168.0.11
192.168.1.0
192.168.2.0

Encontrar endereços IP ausentes:

$ egrep -v "'cat l2|xargs -I {} echo -n '|{}'|sed -e 's/^|//''" l1
192.168.2.14
192.168.0.9

Encontre endereços IP duplicados:

$ egrep  "'cat l2|xargs -I {} echo -n '|{}'|sed -e 's/^|//''" l1
192.168.0.10
192.168.0.11

Espero apenas que seus arquivos não sejam muito longos para transbordar o comprimento máximo da linha de comando: - (

    
por 13.11.2015 / 07:35