Agradecemos antecipadamente por qualquer ideia que você apresentar.
Meu projeto atual consiste em tentar fazer um loop de um arquivo contendo uma lista de milhares de endereços IP por meio do geoiplookup e direcioná-lo ao sed para excluir todas as linhas que não correspondem aos critérios.
A lista é apenas uma lista de endereços IP:
1.2.3.4
5.6.7.8
9.10.11.12
.
.
.
Em seguida, executo geoiplookup ip.ad.dre.ss
como root e obtenho:
[root@system ipset]# geoiplookup 4.2.2.2
GeoIP Country Edition: US, United States
se o IP estiver dentro dos EUA.
Meu objetivo é excluir todas as linhas do arquivo, se o IP deles não estiver nos EUA.
O que tentei não está funcionando:
#!/bin/bash
for ip in $(cat /tmp/iplist.txt); do
geoiplookup $ip | sed '/GeoIP Country Edition: US, United States/!d'
done
Alguma sugestão? Recomendações de outra abordagem seriam muito apreciadas.
@terdon Desculpe não ter atualizado antes, estive ocupado.
Adicionar qualquer um a esta pergunta ou comentário bagunça a formatação do texto. Desculpe, novato no Stack...deixe-me descobrir isso.
OK, atualização.
depois de alterar e executar o primeiro código do @terdon:
#!/bin/bash
while read ip; do
if ! geoiplookup "$ip" | grep -q ': US, United States$'; then
sed -i "/^$ip$/d" /tmp/iplist.txt
fi
done < /tmp/iplist.txt
ele roda sem erros, mas endereços IP não americanos ainda estão na lista.
Eu estava usando o último exemplo com odeclare -a badLines
scripts#geoiplookup 172.168.155.63
GeoIP Country Edition: GB, United Kingdom
scripts#grep 172.168.155.63 /tmp/iplist.txt
172.168.155.63
Assim que eu descobrir como fazer o copiar e colar funcionar corretamente na pergunta, atualizarei.
@Ed Morton Ambos os exemplos produzem o mesmo erro na linha "done", linha 7 em um e linha 9 no outro.
./filter_ips.sh: line 7: syntax error near unexpected token `done'
./filter_ips.sh: line 7: ` done < "${@:--}"'
@Miri B Eles funcionam, mas ainda há endereços IP de fora dos EUA na lista.
Você quer fazer um loop sobre as linhas, verificar se elas contêm um IP que mapeia para os EUA e, se não, excluir essa linha do arquivo. Sua abordagem falhou porque você está usando
sed
na saída dogeoiplookup
comando, não no arquivo.O que você precisa fazer é verificar cada IP e, então, voltar ao arquivo. Então você pode fazer algo assim (note que não estou usando
for i in $(cat file)
aqui; veja Bash pitfall #1 para saber por que isso é uma má ideia):Note que isso também removerá entradas que simplesmente não podem ser mapeadas para sua localização. Por exemplo, algo como este site:
Se você quiser mantê-los, você pode usar isto:
No entanto, ambos são um pouco ineficientes, pois precisam que o arquivo inteiro seja processado várias vezes. Uma abordagem alternativa seria ler o arquivo uma vez para gerar a lista de linhas que você deseja excluir e, em seguida, excluí-las com uma segunda passagem. Algo assim:
Se você passar
sed
o comandoNd
ondeN
é um número, ele apagará o número da linha da entrada. Então, se eu executarsed 2d file
, isso imprime o conteúdo do arquivo, exceto a segunda linha. Lembre-se, sempre comsed
, se você quiser que a alteração seja realmente salva no arquivo , você precisa de-i
. Sosed -i 2d file
apagará a segunda linha defile
.Aqui, estou lendo o arquivo uma vez e coletando a lista de números de linha que quero excluir. Então, eu converto essa lista separada por espaços, para o
Nd;
formato com um pequenosed
comando e, finalmente, estou passando o comando sed resultante (pareceria com2d;3d;130d;
etc) parased
realmente modificar o arquivo.Se
geoiplookup
(o que eu não tenho) só puder processar 1 endereço IP por vez, considere algo como o seguinte (não testado):ou:
Experimente estes dois códigos awk:
Ou outro, provavelmente mais rápido: