按 shell 中第一个视为数字的字段对文件中的行进行排序

按 shell 中第一个视为数字的字段对文件中的行进行排序

我有一个文件,其格式如下所示(一个数字 + 一个 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.* 地址是按数字排序的。

相关内容