专栏首页python3使用Python处理文本,整理信息

使用Python处理文本,整理信息

处理思科网络设备show ip int brief的输出内容

任务目标

通过Python将上述的命令输出从一整个文件中取出来,并转换成表格。否则,我需要分别打开每一个文件,找到对应的输出,拷贝到Ecxel,再进行数据分列动作,操作繁琐而且重复性很大,因此考虑用Python尝试自动化完成此项工作。

show ip int brief 输出内容示例

RP/0/RSP0/CPU0:a9k-1-new#sh ip int brief
Wed Jul 26 16:19:04.551 PRC

Interface                      IP-Address      Status          Protocol Vrf-Name
Loopback0                      106.53.15.80   Up              Up       default 
Loopback10                     10.53.135.87    Up              Up       vpn-1   
MgmtEth0/RSP0/CPU0/0           unassigned      Shutdown        Down     default 
MgmtEth0/RSP0/CPU0/1           unassigned      Shutdown        Down     default 
MgmtEth0/RSP1/CPU0/0           unassigned      Shutdown        Down     default 
MgmtEth0/RSP1/CPU0/1           unassigned      Shutdown        Down     default 
GigabitEthernet0/0/0/0         106.53.3.26    Down            Down     default 
GigabitEthernet0/0/0/1         unassigned      Shutdown        Down     default 
GigabitEthernet0/0/0/2         106.53.3.230   Shutdown        Down     default 
RP/0/RSP0/CPU0:a9k-1-new#

a9k-1-new的配置文件存在a9k-1-new.log文件中。

Python代码及注释

# 引入re模块
import re
import csv
# 使用一个变量,方便进行批量处理
config_file = 'a9k-1-new.log'
# 将配置文件整个读入,形成一个大的data_buffer
with open(config_file) as file_obj:
data_buff = file_obj.read()

# 查找的关键,使用一个正则表达式,这个正则表达式经过反复尝试出来的。
mixRegex = re.compile(r'^Interface\s+IP-Address\s+Status.*\n'
                          r'(^[A-Z]\w+\d+.*\n)+'
                          r'^RP.*#'
                          ,re.MULTILINE)

# “r” 是为了告诉编译器这个string是个raw string,不要转意backslash '\'。
# 第一行匹配show ip int brief 输出的首行(表头)
# “^Interface”匹配以Interface开头
# “\s+”表示后面跟着一个或多个空白
# 后续继续匹配IP-Address和Status,就可以匹配到首行了
# “.*”表示后面任意字符重复零次或任意次
# “\n”表示最后的换行符
# 第二行匹配接口的信息项,因为信息类别比较多,如果要考虑周全,需要复杂的正则表达式,此处是一个较简单的写法
# 用“()”括号括起来,表示一组,后面的“+”表示对整组进行重复;
# “^[A-Z]\w+\d+.*\n”表示以大写字母开头,后面跟着数字,接口名称都是大写字母开头,后面跟着数字,基本可以匹配接口的输出了;
# 第三行匹配结束信息,如果有条件,可以构造一个特殊的结束行;
# 此处匹配RP开头,以#结尾。

# 调用search()方法,完成搜索
mix_match = mixRegex.search(data_buff)

# 搜索完成后,返回的值是一个大的字符串。
print(mix_match.group())

# 按照换行符,将字符串进行分割,分割为一个列表;
split_lines = mix_match.split('\n')

# 将分割完成的列表做进一步处理,形成一个二维列表。
intf_status_list = []
# sub_list = re.split(r’\s{2,}’, line) 表示分割间隔要求在两个字符以上,否则,像admin shutdown也会被分开。
for line in split_lines:
    sub_list = []
    # sub_list = line.split()
    sub_list = re.split(r'\s{2,}', line)
    intf_status_list.append(sub_list)

# 用pop()函数删除列表的最后一个单元,结束行。
intf_status_list.pop()

# 以下代码将上述生成的二维列表写入到CSV文件中。
csv_output = config_file + '-int_status.csv'

with open(csv_output,'w') as file_obj:
    wr = csv.writer(file_obj)
        for list in intf_status_list:
            wr.writerow(list)

生成的csv文件,可以用Excel直接打开,如下: 图片上传失败,以下是CVS cat的输出:

Interface,IP-Address,Status,Protocol Vrf-Name
Loopback0,106.53.15.80,Up,Up,default 
Loopback10,10.53.135.87,Up,Up,vpn-1,
MgmtEth0/RSP0/CPU0/0,unassigned,admin Shutdown,Down,default 
MgmtEth0/RSP0/CPU0/1,unassigned,Shutdown,Down,default 
MgmtEth0/RSP1/CPU0/0,unassigned,Shutdown,Down,default 
MgmtEth0/RSP1/CPU0/1,unassigned,Shutdown,Down,default 

如果程序其他地方需要使用该数据,也可以对列表进行遍历访问。

对文件进行批处理

有两个办法: 一、通过Shell脚本,批量处理。 在代码中做如下修改:

# 引入sys模块,通过命令行传入文件名。
import sys

config_file = sys.argv[1]
# config_file = ‘a9k-1-new.log’

在目录下运行ls 命令,将所有需要处理的文件列出,然后编辑Shell 脚本如下,保存为

batch_process.sh
python3 config_process.py a9k-1-new.log
python3 config_process.py a9k-2-new.log
python3 config_process.py a9k-3-new.log
python3 config_process.py a9k-4-new.log
chmod +x batch_process.sh

然后运行./batch_process.sh 几秒钟时间,转换就完成了。

二、将程序本身修改为批处理类型

#引入os模块,列出整个目录,仅处理包含“a9k”的文件
import os

files = os.listdir('.')
for filename in files:
    if 'a9k' in filename:
        config_file = filename

下一篇文章处理show inventory输出。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python metaclass 详细说明

    在理解metaclass之前,我们需要先理解Python中的class。从某种程度上来说,Python中的class的定位比较特殊。

    用户5760343
  • Python编程常见问题与解答

    答:一般来说,Python代码的运行速度比C语言的慢很多,但是如果充分运用内置函数、标准库对象和函数式编程模式的话,运行速度会提高很多,可以接近C语言。

    Python小屋屋主
  • Jmeter之Http请求上传文件/上传图片

    之前文章用Python实现过文件上传/图片上传Python模拟实现multipart/form-data格式上传图片文件,今天我们来用Jmeter来实现下

    橙子探索测试
  • 分享十张表的数据!大家一起玩!

    最近有一些朋友留言表示对python不太熟悉,也不太会使用爬虫,但是对文中的数据很感兴趣。问小五能不能分享一下这些数据。

    朱小五
  • python 类支持with调用

    为了让一个对象兼容 with 语句,你需要实现 __enter__() 和 __exit__() 方法。 例如,考虑如下的一个类,它能为我们创建一个网络连接:

    用户5760343
  • python 类中的单下划线和双下划线

    Python中没有访问控制的关键字,例如private、protected等等。但是,在Python编码中,有一些约定来进行访问控制。

    用户5760343
  • python metaclass ..

    关于Python2.x中metaclass这一黑科技,我原以为我是懂的,只有当被打脸的时候,我才认识到自己too young too simple someti...

    用户5760343
  • Python之requests入门

    最近在学习Python相关的框架花了点时间,早期在python+Selenium+Unittest+HTMLTestRunner(UI自动化这块花了些时间实践了...

    测试小兵
  • 尾递归优化原理与Python实现(以Fibonacci数列和小明爬楼梯问题为例)

    众所周知,在函数递归调用时,要保存函数调用的位置以便使得被调函数结束后能够返回正确的位置,这个信息保存在线程栈中。由于栈的空间有限,所以如果函数递归调用深度超过...

    Python小屋屋主
  • python3 网络爬虫 实例1

    pip install scrapy pip install pyOpenSSL pip install cryptography pip install...

    用户5760343

扫码关注云+社区

领取腾讯云代金券