Este foi divertido.
Primeiro, precisamos eliminar os comentários à direita , como em:
86.242.200.81 banana.domain.net # comment
Podemos fazer isso com o seguinte (assumindo apenas espaços, sem guias):
sed 's/ *#.*//'
Se você tiver guias no arquivo de hosts, talvez execute isso primeiro:
tr '\t' ' '
Em seguida, precisamos eliminar os comentários de "comentar esta linha", os quais definirei como um único caractere de hash que precede um endereço IP. Podemos remover aqueles assim:
sed '/^#[0-9]/ s/^#//'
Colocando o acima juntos, conseguimos:
### Comments
# Comments
86.242.200.81 banana.domain.net
86.242.200.3 orange.domain.net
31.28.225.81 monkey.anotherdomain.net
51.18.33.4 puffin.domainz.com
31.28.220.80 monkey.anotherdomain.net
86.242.201.3 orange.domain.net
Se classificarmos isso na segunda coluna ( sort -k2
), obteremos uma lista ordenada por nome:
86.242.200.81 banana.domain.net
# Comments
### Comments
31.28.220.80 monkey.anotherdomain.net
31.28.225.81 monkey.anotherdomain.net
86.242.200.3 orange.domain.net
86.242.201.3 orange.domain.net
51.18.33.4 puffin.domainz.com
E agora podemos aplicar uniq
para encontrar duplicatas, se dissermos que uniq
ignora o primeiro campo:
uniq -c -f 1
O que nos dá:
2
1 86.242.200.81 banana.domain.net
1 # Comments
1 ### Comments
2 31.28.220.80 monkey.anotherdomain.net
2 86.242.200.3 orange.domain.net
1 51.18.33.4 puffin.domainz.com
Portanto, se procurarmos linhas com uma contagem de 2 ou mais, encontramos nossas duplicatas. Colocando tudo isso junto, conseguimos:
#!/bin/sh
tr '\t' ' ' |
sed '
/^#[0-9]/ s/^#//
s/ *#.*//
/^ *$/ d
' |
sort -k2 |
uniq -f 1 -c |
awk '$1 > 1 {print}'
A instrução final awk
no script acima procura linhas nas quais a contagem de uniq
(field1) é > 1
.
A execução do script acima parece este .