Sorting 在vim中对IP地址进行排序
我刚刚在vim中发现了命令Sorting 在vim中对IP地址进行排序,sorting,vim,ip-address,Sorting,Vim,Ip Address,我刚刚在vim中发现了命令:sort n(我怎么不知道?!),它几乎完全满足了我的需要 不过,我试图排序的是一个很长的IP地址列表(它是一个“允许主机”文件,将包含到我们的apache配置中),如果:sort n能够识别123.45.6.7应该在123.45.16.7之前排序(例如),那就太好了 如果没有稍微复杂的sed或awk命令或其他什么东西,我就无法做到这一点,因此我应该少点强迫症,不用担心,这是一个安全的假设吗 为了清楚起见,所有行看起来都类似于: Allow from 1.2.3.4
:sort n
(我怎么不知道?!),它几乎完全满足了我的需要
不过,我试图排序的是一个很长的IP地址列表(它是一个“允许主机”文件,将包含到我们的apache配置中),如果:sort n
能够识别123.45.6.7
应该在123.45.16.7
之前排序(例如),那就太好了
如果没有稍微复杂的sed
或awk
命令或其他什么东西,我就无法做到这一点,因此我应该少点强迫症,不用担心,这是一个安全的假设吗
为了清楚起见,所有行看起来都类似于:
Allow from 1.2.3.4
Allow from 5.6.7.8
Allow from 9.10.11.12
etc我不是vim用户,因此我无法提供使用内置命令直接执行的方法,但是可以使用通过命令运行的文本输出替换文本部分。因此,可以使用这样一个简单的脚本:
#/usr/bin/python
导入系统
input_lines=sys.stdin.readlines()
已排序的\u行=已排序的(输入\u行,
key=lambda行:映射(int,line.split()[-1].split('.'))
对于排序的_行中的行:
系统标准输出写入(行)
请参阅“通过外部过滤器过滤文本”一节,其中解释了如何将其用作vim中的过滤器
这个脚本应该做您想要做的事情,并且可以在所有选定线路都以IPv4地址结尾的任何区域工作。Vim sort在实践中似乎是稳定的(但不能保证)。因此,您可以尝试:
:%sort n /.*\./
:%sort n /\.\d\+\./
:%sort n /\./
:%sort n
它将按最后一个点后的数字进行排序(*
是贪婪的),然后按点和数字后的第一个点后的数字进行排序,然后按第一个点后的数字进行排序,最后按第一个数字进行排序。实现正确排序顺序的简单方法
依靠排序算法的稳定性来实现
:sort
命令,用于在IP内的数字前加零
地址,以便其中的所有组件都由
三位数
在一位数和两位数前加零:
:%s/\<\d\d\?\>/0&/g|%&&
带冗余前导零:
:%s/\<00\?\ze\d//g
:%s/\几乎完全完美(之所以不是它的唯一原因是因为我没有提到我的一些行是网络掩码)。非常感谢。这让我能够自己对网络掩码进行排序。使用管道,您可以一次完成所有操作::%sort n/*./\124;%sort n/\.\d\+./\124;%sort n/\./\124;%sort n
天哪,谢谢。我试图避免运行一个脚本(主要是因为它是一个尚未上线的生产服务器,所以有一个简单的安装,并且python
不在那里),但这看起来很神奇;非常感谢。
:%s/\<00\?\ze\d//g
:%s/\<\d\d\?\>/0&/g|%&&|sor r/\(\d\{3}\)\%(\.\d\{3}\)\{3}/|%s/\<00\?\ze\d//g