Eu tenho um arquivo no formato da seguinte maneira:
$ cat file.txt
27.33.65.2
27.33.65.2
58.161.137.7
121.50.198.5
184.173.187.1
184.173.187.1
184.173.187.1
Qual é a melhor maneira de analisar o arquivo file.txt
em um formato como:
27.33.65.2: 2
58.161.137.7: 1
121.50.198.5: 1
184.173.187.1: 3
Em outras palavras, desejo percorrer o arquivo e contar o número de vezes que cada endereço IP aparece. Eu já o executei sort
para que todos os endereços IP estejam em ordem e diretamente um após o outro.
Respostas:
Você está procurando
uniq -c
Se a saída não for do seu agrado, ela poderá ser analisada e reformatada prontamente.
Por exemplo:
fonte
uniq
eawk
não parece ser uma grande abordagem para mim ...uniq
funciona apenas na entrada classificada (corresponde a linhas correspondentes adjacentes, não a linhas do arquivo).sort
!uniq
parece ser a solução mais inteligente, de fato. A maneira inábil:fonte
sort
à minha resposta ainda é mais rápido, pois menos itens precisam ser classificados. ;-)arquivo de ordenação mais firmado, em seguida, obtenha a contagem por unic -c
sort filename | uniq -c
fonte
uniq -c
funcionaria, mas forneceria a saída no formato errado. É por isso que a resposta aceita não usasort
e reformata a saída deuniq -c
.Eu usaria python. Hoje em dia, todos os ststem linux têm o python2 instalado.
Adicione cada endereço IP em um dict (matriz associativa) como pares chave = valor, ou seja, {"12.34.56.78": 1, "87.76.43.21": 3}.
Você 'verifica' o endereço IP como uma chave e aumenta o valor em 1. Se você usar defaultdict ("ip"), se a chave não existir, ela será criada com o valor padrão 0. Se a chave existir já, defaultdict não faz nada. O valor é incrementado na próxima linha.
arquivo de saída:
Eu sei que você estava procurando uma solução de linha de comando, mas como você pode ver, é uma tela formatada com elegância que levou apenas uma dúzia de linhas. Python é uma excelente ferramenta para administração.
fonte