正则

基础语法

常见数据类型 说明
0-9 数字
a-z 小写字母a,b,c……z
A-Z 小写字母A,B,C……Z
空格
! 特殊字符
' 特殊字符
" 特殊字符
# 特殊字符
$ 特殊字符
% 特殊字符
& 特殊字符
( 特殊字符
) 特殊字符
* 特殊字符
+ 特殊字符
, 特殊字符
- 特殊字符
. 特殊字符
/ 特殊字符
: 特殊字符
; 特殊字符
< 特殊字符
= 特殊字符
> 特殊字符
? 特殊字符
@ 特殊字符
\ 特殊字符
基础语法 语法描述
a|b 匹配 a 或 b
gr(a|e)y 匹配 gray 或 grey
[abc] 匹配任一字符: a 或 b 或 c
[^] 表示非的意思,!
[^0-9] 非数字,包括小写字母、大写字母、空格、特殊字符。
[^a-z] 非小写字母,包括数字、大写字母、空格、特殊字符。
[^abc] 匹配任一字符, 但不包括 a, b, c
[a-z] 匹配从 a 到 z 之间的任一字符
[a-zA-Z] 匹配从 a 到 z, 及从 A 到 Z 之间的任一字符
[0-9] 匹配数字0-9之间任意数字
{x} 匹配前一项内容的x次
{x,y} 匹配前一项内容的x到y次
\num 对前面所匹配分组的引用。比如(\d)\1可以匹配两个相同的数字,(Code)(shop)\1\2则可以匹配CodeShopCodeShop
^ 匹配字符串或行开头
$ 匹配字符串或行结尾。
\r 匹配回车
\n 匹配换行符
\t 制表符,tab键
\d 匹配数字
\D 匹配非数字(字母、空格、其它字符(换行符等))
\w 匹配任何字母数字,包括下划线(等价于[A-Za-z0-9_]
\W 匹配任何非字母数字(等价于[^A-Za-z0-9_]
\s 空白。匹配任何空白字符,包括空格、制表符等。
. 匹配除换行符以外的任何单个字符
* 匹配前一项内容 0 或多次
匹配前一项内容 0 或 1 次
+ 匹配前一项内容 1 或多次
\ 转义字符

实际应用

思科N7K路由表 和华为CE168路由表对比

背景:某个客户数据中心N7K使用多年,最近准备替换成华为CE168,割接前后需要去对比设备路由表信息,但思科N7K和华为CE168路由表数据结构不一致,故无法直接通过对比软件进行对比。

思路:

  • 将N7K和华为CE168路由表做成一致的格式后就可以通过对比软件进行对比(此步骤使用正则实现)。
  1. 思科路由表
路由表 描述
10.0.0.0/8, ubest/mbest: 1/0
*via 84.0.0.0, [1/0], 11w3d, static 静态路由
9.8.0.0/16, ubest/mbest: 1/0
*via 10.4.132.9, [6/0], 6w3d, bgp-65010, external, tag 65000 ebgp路由
10.0.0.0/16, ubest/mbest: 1/0
*via 10.227.3.22, [8/0], 6w6d, bgp-65010, internal, tag 65000 ibgp路由
10.4.132.8/30, ubest/mbest: 1/0, attached
*via 10.4.132.10, Eth7/4, [0/0], 11w3d, direct 直连路由
10.4.132.10/32, ubest/mbest: 1/0, attached
*via 10.4.132.10, Eth7/4, [0/0], 11w3d, local 本地路由
10.4.3.131/32, ubest/mbest: 1/0
*via 10.4.164.29, Eth7/21, [110/100], 11w3d, ospf-65010, intra ospf内部路由
10.0.188.0/24, ubest/mbest: 1/0
*via 10.4.228.14, Eth7/32, [110/30], 11w3d, ospf-65010, type-1, tag 1 ospf外部type1路由
10.4.3.41/32, ubest/mbest: 1/0
*via 10.4.148.129, Eth7/13, [110/100], 11w3d, ospf-65010, type-2, tag 1 ospf外部type2路由
10.224.3.131/32, ubest/mbest: 2/0
*via 10.4.132.146, Vlan3002, [110/32], 6w6d, ospf-65010, intra
*via 10.4.132.161, Vlan270, [110/32], 5w6d, ospf-65010, intra ospf路径负载的路由

2.华为路由表

<xxx>display ip routing-table
Proto: Protocol        Pre: Preference
Route Flags: R - relay, D - download to fib, T - to vpn-instance, B - black hole route
------------------------------------------------------------------------------
Routing Table : _public_
         Destinations : 1903     Routes : 1911      

Destination/Mask    Proto   Pre  Cost        Flags NextHop         Interface

        0.0.0.0/0   O_ASE   150  100           D   10.4.3.2      Vlanif888
       2.15.0.0/16  O_ASE   150  100           D   10.4.3.2      Vlanif888
      2.15.63.0/24  O_ASE   150  5200          D   10.4.3.2      Vlanif888
        9.0.2.0/24  O_ASE   150  109           D   10.4.3.2      Vlanif888
        9.0.2.1/32  O_ASE   150  109           D   10.4.3.2      Vlanif888
       9.0.2.37/32  O_ASE   150  109           D   10.4.3.2      Vlanif888
      9.0.2.178/32  O_ASE   150  109           D   10.4.3.2      Vlanif888
      9.0.2.179/32  O_ASE   150  109           D   10.4.3.2      Vlanif888
      9.0.2.196/32  O_ASE   150  109           D   10.4.3.2      Vlanif888
      9.0.2.197/32  O_ASE   150  109           D   10.4.3.2      Vlanif888

步骤:

  1. 定义 华为和思科路由表的一致格式(选用路由表中的4个字段)
网络号/掩码 下一跳IP地址 路由优先级 路由cost
  1. 思科N7K路由表通过使用文本编辑软件(比如UE)中的正则表达式 进行标记行,复制行,通过替换得到相应的字段
步骤 匹配关键字 替换字符 语法说明
1 ubest/mbest: 标记所在行 然后复制行 匹配路由表中的网络号/掩码 行
2 (, ubest/mbest: 1/0.*|, attached) 将, ubest/mbest: 1/0删除
3 , ubest/mbest: 2/0 \n 将, ubest/mbest: 1/0替换成一个回车字符。1-3步得到网络号/掩码
4 *via 标记所在行 然后复制行 匹配路由表中的下一跳等信息 行
5 ,.* 将下一跳后面的信息删除
6 .**via 将下一跳前面的信息删除,得到下一跳字段。4-6步 得到下一跳
7 ].* 再次使用步骤4匹配的行,将]及后面的信息删除
8 .*[ 将]及前面的信息删除
9 /.* 删除/及cost值。7、8、9步 得到路由优先级
10 .*/ 删除/及路由优先级。7、8、10步 得到cost字段
  • 最后思科N7K的路由会整理成这种表格(最后一条路由因为是负载路由,所以网络/掩码只显示在1行里,数据量大的情况下可以通过execl批量将空白的单元格填充)
网络号/掩码 下一跳IP地址 路由优先级 路由cost
10.0.0.0/8 84.0.0.0 1 0
9.8.0.0/16 10.4.132.9 6 0
10.0.0.0/16 10.227.3.22 8 0
10.4.132.8/30 10.4.132.10 0 0
10.4.132.10/32 10.4.132.10 0 0
10.4.3.131/32 10.4.164.29 110 100
10.0.188.0/24 10.4.228.14 110 30
10.4.3.41/32 10.4.148.129 110 100
10.224.3.131/32 10.4.132.146 110 32
10.4.132.161 110 32
  1. 华为交换机直接通过execl中分列功能就可以直接得到那4个列的数据,然后copy 4列信息,通过比对软件对比路由。

批量查看巡检信息

背景:某个客户网络有50台以上网络设备需要巡检,通过在客户现场收集完设备信息后(一台设备一个log日志文件),工程师通过查看设备输出的log日志,确认设备是否存在异常情况,每台设备执行了很多display命令,如果单台单台看设备的所有信息,可能比较耗费精力和时间。

display current-configuration 
display version
display irf
display clock 
display logbuffer
display startup 
display fan 
display power
display environment 
display memory 
display cpu-usage 
display cpu-usage history 
display interface brief
display ip interface  brief 
display vrrp
display vrrp verbose 
……

通过人工方式巡检,借助正则可能更省力一些。

思路:将所有设备log信息汇总在一起,针对单条巡检命令查看所有设备的状态。

以查看所有设备的电源模块状态为例(display power)

步骤:

  1. 将所有的log文件copy到一个log文件(在win 的cmd下可以快速实现 copy *log sum.log)
  2. 通过正则表达式匹配所有设备display power的信息(需要借助notepad++),匹配后将copy到一个临时txt文件里,一次性查看所有设备的电源模块信息。
表达式:
display power.{30,500}<         {30,500}括号内的数值根据实际情况填写
image-20230301211804021 6b57973c4c035f17d1653984ed5b1c0

Tips:之前做巡检用到的其它正则表达式

>display device
(>display clock|BJ Wed 05/20/2020)
(>display power|1          AC|2          AC)
(>display fan|Fan   . State: Normal)
(>display environment|[0-9].*-10              53)
(>display version|uptime is .*weeks)
(>display startup|Current startup saved-configuration file:|Next main startup saved-configuration file:|Next backup startup saved-configuration file:)
(>display boot-loader|The boot file used this time:|The boot file used next time:)
(>display alarm|No alarm information)
(>display cpu-usage|in last 5 seconds|in last 1 minute|in last 5 minutes)
(>display memory|Used Rate:)
(user-interface vty|acl .* inbound|authentication-mod|command |user privilege level|idle-timeout|protocol inbound)


S75
(>display power|Power        2 State)
(>display environment|[0-9].*0      80       97)
(user-interface vty|acl .* inbound|authentication-mod|command |user privilege level|idle-timeout|protocol inbound)


xx巡检
1.端口没有shutdown
\d current state : DOWN|sysname

2.端口up 但没有描述
current state : UP.{10,70}Description:|sysname
勾选.匹配换行

3.查看告警
>display alarm active$

4.startup
>display startup.{100,1600}<|sysname
SlaveBoard.{100,800}<

5.license
>display license|License state     :

6.监听端口
sysname|:.*Listen

7.收集内存利用率
>display memory|Memory Using.*%

8.收集mac数量
>display cur|Total items

9.统计cpu
CPU Usage            :|>display cpu|CPU Using Percentage :

学习网站

https://docs.python.org/zh-cn/3/library/re.html //正则表达式操作 — Python 3.11.2 文档

https://www.r2coding.com/#/README //一位资深码农编写的一个大而全的网站

posted @ 2023-03-01 18:10  wefjack  阅读(91)  评论(0)    收藏  举报