根据特定的数字模式对行进行排序

根据特定的数字模式对行进行排序

假设我有一个包含以下几行的文本文件:

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]

我想要一个 grep/sort 语句来计算前四个数字匹配的行并打印该计数。

上面示例的预期输出是:

192.168.1.1 7
8.8.8.8 4
192.168.1.2 1

旁注:

  1. 我正在尝试对netstat输出进行排序,实际上我正在处理的行是 IP 地址后跟端口号。

  2. 我的 unix 系统需要执行此操作,但没有uniq工具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

相关内容