O script a seguir opera com base na remoção de caracteres finais e na verificação da string resultante em relação a nslookup
consultas do seu servidor DNS:
#!/bin/bash
find_correct_domain(){
local string="$1"
while ! nslookup "$string" &> /dev/null
do
string="${string%?}"
done
echo "$string"
}
main(){
local new_line=""
while IFS= read -r line
do
case "$line" in
http*) new_line=${new_line##*/} ;;
*) new_line="$line";;
esac
find_correct_domain "$new_line"
done < "$1"
}
main "$@"
Usando o arquivo de entrada fornecido pelo OP, a saída resultante é a seguinte:
$ ./format_domains.sh input.txt
google.com.
www.google.co.uk.se
google.co.
www.google.co.uk.se
m.google.com
m.google.com
Observe que o ponto à direita no final de google.com.
e google.co.
consultas DNS (que é o que executa nslookup
) terminam em um ponto, a menos que você faça isso, portanto google.com.
é uma consulta DNS válida ( de acordo com o RFC 1034 . Consulte este artigo para obter mais informações: link
Se o ponto à direita não for desejável, você pode adicionar a instrução case
simples na função find_correct_domain
para apará-la, assim:
find_correct_domain(){
local string="$1"
while ! nslookup "$string" &> /dev/null
do
string="${string%?}"
done
case "$string" in
*.) string="${string%?}";;
esac
echo "$string"
}
Claro, lembre-se de que esse script não está otimizado para desempenho: é feito em bash
e executa nslookup
em todos os itens, então provavelmente o tipo O (n 2 ) de tempo de execução, o que significa que, se você tiver uma lista grande, provavelmente será lento, mas para listas relativamente pequenas, tudo bem.