python实战系列之ip地址排序问题(

发布时间:2019-09-01 09:50:19编辑:auto阅读(1539)

    1. 背景说明

       从openstack的nova list中获取了虚拟机的ip地址,但这些ip都没有排序和分组,为了进一步增强可读性,对ip地址执行排序操作,在shell下,可以通过sort命令,执行排序操作,具体操作如下:

    [root@controller ~]# cat ip.txt | sort -t "." -k1,1n -k2,2n -k3,3n -k4,4n
    10.1.104.75
    10.1.104.87
    10.1.104.149
    10.1.104.151
    10.1.105.1
    10.1.105.7

       上面的方式,可以实现ip地址的排序,如下通过python的方式,实现ip地址的排序,以携带文件的方式执行,先ip地址读入到一个列表中,通过列表的sort()方法,执行对ip地址的排序


    2. 脚本内容

    #!/usr/bin/env python
    #-*- coding:utf8 -*-
    '''
    author:Happy
    from: Happy云实验室
    欢迎交流
    '''
    import sys
    import os.path
    def ipsort(filepath="ip.txt"):
            '''
            定义一个函数,用于将ip地址排序, 默认的文件路径是当前目录下的ip.txt文件,返回排序后的ip地址列表
            '''
            try:
                    ip = []
                    f = file(filepath,'r')
                    fcontext = f.readlines()
                    for ips in fcontext:
                            ips = ips.strip()
                            ip.append(ips)
                    ip.sort(lambda x,y: cmp(''.join( [ i.rjust(3, '0') for i in x.split('.')] ), ''.join( [ i.rjust(3, '0') for i in y.split('.')])))       #排序
                    f.close()
            except Exception,msg:
                    print "Error:%s" % (msg)
                    sys.exit(1)
            return ip
    def main():
            '''
            检查脚本携带参数的情况,必须携带一个参数——文件名,并检查文件名是否存在,调用排序的函数ipsort()
            '''
            try:
                    if len(sys.argv) != 2:
                            print "Usage: %s %s" % (sys.argv[0],sys.argv[1]) 
                    else:
                            if os.path.exists(sys.argv[1]):
                                    filename=sys.argv[1]
                            else:
                                    print "%s is not exists!" % (sys.argv[1])
                                    sys.exit(1)
                    ip = ipsort(filename)           #执行排序函数调用
                    for ips in ip:
                            print ips
            except Exception,msg:
                    print "\033[31mError: %s\033[0m" % (msg)
    if __name__ == "__main__":
            main()


    说明: 运行方式为,脚本+参数的形式,如下为测试结果:

    [root@controller ~]# /usr/local/sbin/ipsort.py /root/ip.txt 
    10.1.104.75
    10.1.104.87
    10.1.104.222
    10.1.104.250
    10.1.105.1
    10.1.105.7


    *******************************************

    !学习是一个漫长痛苦的过程,需要持之以恒!

    *******************************************

关键字