我有一个文件,其格式如下所示(一个数字 + 一个 IPv4 地址)。此格式是使用 生成的uniq -c
。我想对每行中第一个数字后的行进行排序。我本来想使用类似命令的东西sort
,但我不确定如何使用它来仅对那个数字进行排序。
20 0.0.0.0
2 10.0.1.2
2 10.0.1.4
97 114.80.166.219
180 116.6.19.70
1435 121.11.66.70
1 12.172.224.140
34 122.102.64.54
14 122.165.9.200
513 122.226.202.12
650 124.207.117.9
158 124.51.108.68
113 125.235.4.130
24 164.87.166.190
1 166.129.196.88
145 173.9.147.165
3 184.74.167.190
2 188.131.23.37
答案1
听起来您想按 IP 地址的第一个八位字节进行排序:
... | uniq -c | sort -k2,2n
给出
20 0.0.0.0
2 10.0.1.2
2 10.0.1.4
1 12.172.224.140
97 114.80.166.219
180 116.6.19.70
1435 121.11.66.70
34 122.102.64.54
14 122.165.9.200
513 122.226.202.12
650 124.207.117.9
158 124.51.108.68
113 125.235.4.130
24 164.87.166.190
1 166.129.196.88
145 173.9.147.165
3 184.74.167.190
2 188.131.23.37
请注意,仅对第一个八位字节进行排序,因为数字排序在第一个点处停止(如 124.* 的未分类所示)
如果你想对每个八位字节进行排序,因为我不知道你是否可以告诉 sort 使用空格或者点作为分隔符,我们将点转换为空格,进行排序,然后恢复空格(此过程将破坏前导空格,因此我将输出通过管道传输到column
) - 这依赖于 GNU sed。
... | uniq -c | tr . ' ' | sort -k2n | sed 's/^ *//; s/ /./2g' | column -t
20 0.0.0.0
2 10.0.1.2
2 10.0.1.4
1 12.172.224.140
97 114.80.166.219
180 116.6.19.70
1435 121.11.66.70
14 122.165.9.200
34 122.102.64.54
513 122.226.202.12
158 124.51.108.68
650 124.207.117.9
113 125.235.4.130
24 164.87.166.190
1 166.129.196.88
145 173.9.147.165
3 184.74.167.190
2 188.131.23.37
注意现在 124.* 地址是按数字排序的。