Unix - conta endereços IP exclusivos, classifica-os por mais frequentes e também ordena-os por IP quando o número de repetições é o mesmo

4

Eu tenho uma lista de endereços IP no arquivo:

  72.204.55.250
  72.204.55.250
  72.204.55.250
  72.204.55.250
  72.204.55.250
  96.41.51.202
  208.115.113.91
  178.137.94.166
  178.137.94.166
  208.115.113.91
  96.41.51.202
  141.8.143.179
  141.8.143.179

Agora, vou classificá-los e chamar uniq -c service e recebo:

  2  141.8.143.179
  2  178.137.94.166
  2  208.115.113.91
  5  72.204.55.250
  2  96.41.51.202

Agora eu vou classificá-los por mais frequente ( sort -rn ), mas meu problema é também classificá-los por endereço IP quando o número de repetições é o mesmo em ordem decrescente. Eu encontrei um comando de classificação para apenas o endereço IP que funciona:

sort -rn -t . -k1,1 -k2,2 -k 3,3 -k4,4

mas como mencionei acima, não sei como combiná-lo com a primeira coluna (número de repetições) para obter esses resultados esperados:

  5  72.204.55.250
  2  208.115.113.91
  2  178.137.94.166
  2  141.8.143.179
  2  96.41.51.202

Como posso conseguir isso? Agradecemos antecipadamente por qualquer ajuda.

    
por Bc. Poklop 28.11.2015 / 19:40

2 respostas

5

Se sua classificação puder fazer um tipo estável , por exemplo A classificação GNU com a opção -s ou --stable , linhas com campos não relacionados às chaves de classificação, não serão classificadas por esses campos quando houver empates, mas permanecerão nas mesmas posições relativas.

$ sort -n -t. -k1,1 -k2,2 -k3,3 -k4,4 | uniq -c | sort -n -r -s
  5 72.204.55.250
  2 96.41.51.202
  2 141.8.143.179
  2 178.137.94.166
  2 208.115.113.91
    
por 28.11.2015 / 21:33
0

Enquanto você pode fazer isso com ferramentas de linha de comando, aqui está uma maneira de fazer isso rapidamente se você tiver acesso a qualquer banco de dados Postgres (apenas por diversão):

[vagrant@localhost ~]$ cat ips.txt 
72.204.55.250
72.204.55.250
72.204.55.250
72.204.55.250
72.204.55.250
96.41.51.202
208.115.113.91
178.137.94.166
178.137.94.166
208.115.113.91
96.41.51.202
141.8.143.179
141.8.143.179
[vagrant@localhost ~]$ psql
Expanded display is used automatically.
psql (9.3.15)
Type "help" for help.

vagrant=# create temp table ips (ipaddress inet);
CREATE TABLE
vagrant=# \copy ips from ips.txt
vagrant=# select count(*), ipaddress
vagrant-# from ips
vagrant-# group by ipaddress
vagrant-# order by count desc, ipaddress
vagrant-# ;
 count |   ipaddress    
-------+----------------
     5 | 72.204.55.250
     2 | 96.41.51.202
     2 | 141.8.143.179
     2 | 178.137.94.166
     2 | 208.115.113.91
(5 rows)

vagrant=# \q
[vagrant@localhost ~]$ 

Na verdade, eu tenho uma instância do sandbox Postgres em uma máquina do Vagrant para esse tipo de ação. Handy.

Observe a classificação correta por endereço IP, em vez de classificação alfabética. Isso se deve ao uso do tipo de dados Postgres para endereços IP, "inet".

    
por 16.05.2017 / 03:55

Tags