我的文件中有一个 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
说明:
- 首先我们对文件进行排序(没有这个,uniq 将无法工作)
- 然后我们计算列表中每个 IP 出现的次数
- 然后我们再次按计数排序
-n
- 将值视为数字-r
- 颠倒顺序,从最高计数开始-k1
- 按第一列排序(还有更多选项可用,但这就是我们所需要的)