![根据特定的数字模式对行进行排序](https://linux22.com/image/202546/%E6%A0%B9%E6%8D%AE%E7%89%B9%E5%AE%9A%E7%9A%84%E6%95%B0%E5%AD%97%E6%A8%A1%E5%BC%8F%E5%AF%B9%E8%A1%8C%E8%BF%9B%E8%A1%8C%E6%8E%92%E5%BA%8F.png)
假设我有一个包含以下几行的文本文件:
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
旁注:
我正在尝试对
netstat
输出进行排序,实际上我正在处理的行是 IP 地址后跟端口号。我的 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