我要使用Python来辅助解析路由器配置中的Vlan、Eth-Trunk和interface的信息,在这些信息当中,需要体现出Vlan和interface、Eth-Trunk和interface之间的关系。
网上已经有很多比较规整的Python入门的文章,比较规整的入门教程基本上都是从最基础的开始介绍Python语言。这里我就按照我的需要来介绍Python的入门,直接是通过问题出发来学习Python的使用。
第一个来解决的是如何获得设备的名称,在前面介绍过,设备的名称是disp cur命令后,然后去找“sysname XXX”这样的配置。因此,我们需要使用Python在配置文件中来查找“sysname XXX”这样的一段字符串,找到该字符串以后,“sysname”是配置的含义,而“XXX”才是我们想要的设备名称。
那么来整理一下步骤:
1、打开路由器的配置文件
2、将路由器的全部内容读入
3、逐行的查找“sysname XXX”字符串(XXX代表设备具体的名称,由于一台设备只有一个设备名,因此只要找到第一处符合的内容即可)
4、找到后取得设备的名称
按照上面的步骤一步一步来即可。
1、打开路由器的配置文件:
filename = ‘XXXX.log‘ f = file(filename, ‘r‘)
2、将路由器的内容全部读入
content = f.readlines()
3、逐行查找“sysname XXXX”
for c in content: txt = re.search(‘sysname‘, c)
4、找到后取得设备的名称并结束查找
if txt != None: print c print c.split()[1] break
上面是用Python完成的每个步骤的代码,这里简单介绍一下。
file()是一个系统的函数,用来打开文件。打开文件时需要指定打开文件的路径和名称,然后要指定打开文件的方式,这里打开的文件是“XXXX.log”,打开的方式为“r”,也就是只读方式打开文件。打开文件后会返回一个文件对象,使用这个文件对象即可做有关文件相关的操作,比如读取、写入、关闭等操作。在上面的代码中,使用了f.readlines()将文件中的内容读取到content变量中。
当把文件全部读入到content变量中后,使用for循环来遍历content中的每行内容。然后使用re.search()搜索该行是否有“sysname”字符串。因为每台设备名称是不相同的,因此只能搜索该行是否有“sysname”,如果有的话就使用print来输出这行的内容。
在代码中for c in content是将content的每行内容依次给到c变量中,然后用re.search()依此在c变量中查找是否存在“sysname”。搜索到以后会先输出print c,然后再print c.split()[1]。
c.split()[1]是什么鬼?c是“sysname XXXX”,而这时我们需要的是“XXXX”,而不需要“sysname”,因此使用split()函数将这个字符串按空格拆分,分为“sysname”和“XXXX”两个字符串的列表。第一个字符是[0],第二个字符串是[1]。
举个例子看一下:
>>> c = ‘sysname XXXX‘ >>> print c.split() [‘sysname‘, ‘XXXX‘] >>> print c.split()[0] sysname >>> print c.split()[1] XXXX >>>
好了,基本上就介绍这么多,完整的代码如下:
import re filename = ‘XXXX.log‘ f = file(filename, ‘r‘) content = f.readlines() for c in content: txt = re.search(‘sysname‘, c) if txt != None: print c print c.split()[1] break f.close()
上面的代码中第一行import re是导入了一个库,这个库是一个正则表达式的库,正则表达式就是用来匹配文本的。
代码虽短,但是代码中包含了正则表达式、文件操作、循环遍历、字符串等内容。这些内容如果读者不熟悉可以更进一步的搜索相关资料参考。
我是为了使用Python语言,而没有深入的学习Python语言,毕竟我使用到的内容不深,如果对于真正需要深入掌握和理解Python语言的,还是先掌握Python语言的基础知识为好。
注:如果没有什么Python的基础,那么一定要掌握print语言,该语句是用来进行输出的语句,在上面不明白的语句后面,加一条print即可观察当前处理后的变量的值。比如需要查看content中的内容,那么可以直接写如下两句:
for c in content: print c
在学习的过程中注意这一点哦!当然,在随着深入的学习的过程中,最好是去掌握程序的调试,这样才会更好的了解程序的执行过程,和排除程序中的问题。