Unix - подсчитывать уникальные IP-адреса, сортировать их по наиболее частым, а также сортировать по IP при количестве повторений то же самое

Если ширина, которую вы хотите для каждого столбца, заранее определена, awk имеет printf , который работает так же, как в C ; здесь, если вы хотите, например, столбцы из 20, 15 и 10 символов с 2 пробелами между:

(as in Q)  /State/{printf "%-20s  %-15s  %-10s\n", m, F, $2}

( - выровнены по левому краю; по умолчанию выровнены по правому краю, обычно хорошо для чисел но не текст.)

Если вы хотите, чтобы ширина соответствовала данным, вы МОЖЕТЕ сохранить данные в массивах, вычислить желаемую ширину, а затем использовать эту ширину со звездочкой, например printf "% - * s" , len, data - но , поскольку G-Man ответил на столбец , программа делает это проще.

5
28.11.2015, 20:48
2 ответа

Хотя вы можете сделать это с помощью инструментов командной строки, вот способ сделать это быстро, если у вас есть доступ к любой базе данных Postgres (просто для развлечения):

[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 ~]$ 

На самом деле у меня есть песочница Postgres экземпляр на машине Vagrant для такого рода действий. Удобно.

Обратите внимание на правильную сортировку по IP-адресу, а не по алфавиту. Это связано с использованием типа данных Postgres для IP-адресов, «inet».

0
27.01.2020, 20:38

Я думаю, что это может быть намного проще, чем другие решения, опубликованные здесь.

С такими IP-адресами:

72.204.55.250
72.204.55.250
96.41.51.202
208.115.113.91
178.137.94.166

Вы можете просто сделать это :$ sort file | uniq -c | sort -n -r -k1,1

Объяснение:

  1. сначала сортируем файл (без этого uniq работать не будет)
  2. затем мы подсчитываем количество вхождений для каждого IP-адреса в нашем списке
  3. Потом опять сортируем по подсчетам
    • -n-обрабатывать значения как числовые
    • -r-изменить порядок, чтобы сначала было наибольшее количество
    • -k1-сортировать по первому столбцу (доступны дополнительные параметры, но это все, что нам нужно здесь)
0
27.01.2020, 20:38

Теги

Похожие вопросы