特定の数値パターンに基づいて行を並べ替える

特定の数値パターンに基づいて行を並べ替える

次の行を含むテキストファイルがあるとします。

192.168.1.1.55555
192.168.1.1.55555
192.168.1.1.5555
192.168.1.1.555
192.168.1.1.55
192.168.1.1.55
192.168.1.1.5
8.8.8.8.4433
8.8.8.8.443
8.8.8.8.443
8.8.8.8.25
192.168.1.2.99

上記のように、各行には次のパターンがあります(9.9599603594104e + 16個の可能な行があるため、可能なすべてのバリアントを作成することはできません)。

[number composed of 1 to 3 digits].[number composed of 1 to 3 digits].[number composed of 1 to 3 digits].[number composed of 1 to 3 digits].[number composed of 1 to 5 digits]

私は最初の4つの一致する数値行を計算し、その数を印刷するgrep / sortステートメントが必要です。

上記の例の予想結果は次のとおりです。

192.168.1.1 7
8.8.8.8 4
192.168.1.2 1

注:

  1. 出力をソートしようとしていますが、netstat実際に処理されている行はIPアドレスとポート番号です。

  2. uniq私のUnixシステムではこれを行う必要がありますが、ツールはありませんcut。 freebsdに基づいて構築されたいくつかのネットワーキングベンダーのオペレーティングシステムがあります。

この投稿のコメント作成者の一人が、次のことを使用するよう提案しました。

awk -F. '{c[$1 FS $2 FS $3 FS $4]++} END {for (i in c) print i, c[i]}' 

これはうまくいくようです。

答え1

$ cut -d'.' -f1-4 file | uniq -c
      7 192.168.1.1
      4 8.8.8.8
      1 192.168.1.2

または、入力が例に示すようにソートされていない場合、または出力列の順序が重要な場合:

$ cut -d'.' -f1-4 file | sort | uniq -c | awk '{print $2, $1}'
192.168.1.1 7
192.168.1.2 1
8.8.8.8 4

関連情報