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たとえば、GNU sort と一緒に、またはオプションを使用すると、同値がある--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- 最初の列に基づいてソート(より多くのオプションを使用できますが、これは私たちに必要なものです)

関連情報