Bash
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
我怎樣才能做到這一點?提前感謝您的幫助。
如果您的排序可以進行穩定的排序
-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”。