根据输出用正则表达式取值
Based on the output to get value with regular expression
有这样的输出:
RA#show segment-routing traffic-eng on-demand color detail | utility egrep Color -B 10
Sat Dec 25 11:24:22.891 JST
SR-TE On-Demand-Color database
------------------------
On-Demand Color: 20
--
Performance-measurement:
Reverse-path Label: Not Configured
Delay-measurement: Disabled
Liveness-detection: Enabled 《-------
Profile: liveness1
Invalidation Action: down
Logging:
Session State Change: Yes
Per-flow Information:
Default Forward Class: 0
On-Demand Color: 23
--
Performance-measurement:
Reverse-path Label: Not Configured
Delay-measurement: Disabled
Liveness-detection: Enabled 《--------
Profile: liveness1
Invalidation Action: down
Logging:
Session State Change: Yes
Per-flow Information:
Default Forward Class: 0
On-Demand Color: 301
regex "On-Demand Color:\s(\S+)" 可以用来提取颜色 "20,23,301",但由于 "On-Demand Color: 301" 下没有开启活体检测,所以我预计只能提取颜色“20”和“23”。是否可以通过正则表达式来实现?
是的,可以使用正则表达式执行此操作,但请注意,在这种情况下解析器可能会更好。这个想法是搜索你想要的字符串,只要它之后有“Liveness-detection: Enabled”。
正则表达式如下所示:
On-Demand Color:\s(\S+)\n.*\n.*\n.*\n.*\n.*Liveness-detection: Enabled
演示:https://regex101.com/r/SElvt2/1
并且基本上在您找到“On-Demand Color:”字符串后它也匹配几行。这个正则表达式可以进一步简化为:
On-Demand Color:\s(\S+)(\n.*?)*Liveness-detection: Enabled
演示:https://regex101.com/r/857JQM/1
以便“Liveness-detection:”字符串可以位于预期位置之前或之后的几行。
对于第二种方法,这可能更好。
On-Demand Color:\s(\S+)(?:\n.*){5}Liveness-detection: Enabled
如果您想更灵活一点并且值可以出现在 n 行而不是正好 5 行之后,您可以使用负先行。
如果 Liveness-detection: Enabled 在当前的 On-Demand Color: 部分中不存在,这也将防止过度匹配。
On-Demand Color:\s(\S+)(?:\n(?!On-Demand Color:|\s*Liveness-detection:).*)*\n\s*Liveness-detection: Enabled
模式匹配:
On-Demand Color:
匹配起始字符串
\s(\S+)
在捕获组 1 中匹配一个空白字符并捕获 1+ 个非空白字符(或使用 (\d+)
数字)
(?:
非捕获组
\n(?!On-Demand Color:|\s*Liveness-detection:)
.*
匹配整行
)*
关闭非捕获组并可选择重复
\n\s*Liveness-detection: Enabled
匹配一个换行符、可选的空白字符和您要匹配的字符串
有这样的输出:
RA#show segment-routing traffic-eng on-demand color detail | utility egrep Color -B 10
Sat Dec 25 11:24:22.891 JST
SR-TE On-Demand-Color database
------------------------
On-Demand Color: 20
--
Performance-measurement:
Reverse-path Label: Not Configured
Delay-measurement: Disabled
Liveness-detection: Enabled 《-------
Profile: liveness1
Invalidation Action: down
Logging:
Session State Change: Yes
Per-flow Information:
Default Forward Class: 0
On-Demand Color: 23
--
Performance-measurement:
Reverse-path Label: Not Configured
Delay-measurement: Disabled
Liveness-detection: Enabled 《--------
Profile: liveness1
Invalidation Action: down
Logging:
Session State Change: Yes
Per-flow Information:
Default Forward Class: 0
On-Demand Color: 301
regex "On-Demand Color:\s(\S+)" 可以用来提取颜色 "20,23,301",但由于 "On-Demand Color: 301" 下没有开启活体检测,所以我预计只能提取颜色“20”和“23”。是否可以通过正则表达式来实现?
是的,可以使用正则表达式执行此操作,但请注意,在这种情况下解析器可能会更好。这个想法是搜索你想要的字符串,只要它之后有“Liveness-detection: Enabled”。
正则表达式如下所示:
On-Demand Color:\s(\S+)\n.*\n.*\n.*\n.*\n.*Liveness-detection: Enabled
演示:https://regex101.com/r/SElvt2/1
并且基本上在您找到“On-Demand Color:”字符串后它也匹配几行。这个正则表达式可以进一步简化为:
On-Demand Color:\s(\S+)(\n.*?)*Liveness-detection: Enabled
演示:https://regex101.com/r/857JQM/1
以便“Liveness-detection:”字符串可以位于预期位置之前或之后的几行。
对于第二种方法,这可能更好。
On-Demand Color:\s(\S+)(?:\n.*){5}Liveness-detection: Enabled
如果您想更灵活一点并且值可以出现在 n 行而不是正好 5 行之后,您可以使用负先行。
如果 Liveness-detection: Enabled 在当前的 On-Demand Color: 部分中不存在,这也将防止过度匹配。
On-Demand Color:\s(\S+)(?:\n(?!On-Demand Color:|\s*Liveness-detection:).*)*\n\s*Liveness-detection: Enabled
模式匹配:
On-Demand Color:
匹配起始字符串\s(\S+)
在捕获组 1 中匹配一个空白字符并捕获 1+ 个非空白字符(或使用 (?:
非捕获组\n(?!On-Demand Color:|\s*Liveness-detection:)
.*
匹配整行
)*
关闭非捕获组并可选择重复\n\s*Liveness-detection: Enabled
匹配一个换行符、可选的空白字符和您要匹配的字符串
(\d+)
数字)