Unix - 计算唯一的 IP 地址,按最常见的顺序对它们进行排序,当重复次数相同时也按 IP 进行排序

Unix - 计算唯一的 IP 地址,按最常见的顺序对它们进行排序,当重复次数相同时也按 IP 进行排序

我的文件中有一个 IP 地址列表:

  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

现在我将对它们进行排序并致电uniq -c服务人员,我得到:

  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

现在我将按最频繁的 ( sort -rn) 对它们进行排序,但我的问题是当重复次数相同时按 IP 地址对它们进行降序排序。我找到了一个仅适用于 IP 地址的排序命令:

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

但正如我上面提到的,我不知道如何将其与第一列(重复次数)结合起来以获得这些预期结果:

  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

我怎样才能做到这一点?预先感谢您的任何帮助。

答案1

如果你的排序可以做稳定排序-s,例如使用or选项进行 GNU 排序--stable,当存在平局时,具有与排序键无关的字段的行将不会按这些字段进行排序,但将保留在相同的相对位置。

$ 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

答案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 ~]$ 

实际上,我在 Vagrant 机器上有一个沙箱 Postgres 实例来执行此类操作。便利。

请注意按 IP 地址正确排序,而不是按字母顺序排序。这是因为使用了 IP 地址的 Postgres 数据类型“inet”。

答案3

我认为这可能比此处发布的其他解决方案简单得多。

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- 按第一列排序(还有更多选项可用,但这就是我们所需要的)

相关内容