Bash

Unix - 計算唯一的 IP 地址,按最頻繁的方式對它們進行排序,並在重複次數相同時按 IP 對它們進行排序

  • November 29, 2019

我在文件中有一個 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

我怎樣才能做到這一點?提前感謝您的幫助。

如果您的排序可以進行穩定的排序-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

雖然您可以使用命令行工具執行此操作,但如果您可以訪問任何 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”。

引用自:https://unix.stackexchange.com/questions/246104