正则
基础语法
| 常见数据类型 | 说明 |
|---|---|
| 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路由表做成一致的格式后就可以通过对比软件进行对比(此步骤使用正则实现)。
- 思科路由表
| 路由表 | 描述 |
|---|---|
| 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
步骤:
- 定义 华为和思科路由表的一致格式(选用路由表中的4个字段)
| 网络号/掩码 | 下一跳IP地址 | 路由优先级 | 路由cost |
|---|---|---|---|
- 思科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 |
- 华为交换机直接通过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)
步骤:
- 将所有的log文件copy到一个log文件(在win 的cmd下可以快速实现 copy *log sum.log)
- 通过正则表达式匹配所有设备display power的信息(需要借助notepad++),匹配后将copy到一个临时txt文件里,一次性查看所有设备的电源模块信息。
表达式:
display power.{30,500}< {30,500}括号内的数值根据实际情况填写
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 //一位资深码农编写的一个大而全的网站

浙公网安备 33010602011771号