python-3.x - 如何找到指定的字符串并解析接下来的 3 行,如果没有指定的字符串则跳过行
问题描述
我有一个包含数千行的文本文件,我希望在这里找到特定值,然后读取接下来的 3 行并解析它,如果特定行没有接下来的 3 行,则跳过。
这是我的示例文本:
<ASGBGR10043701>
<ASGBGR10043701>dis int | I igabitEthernet|ower
Info: It will take a long time if the content you search is too much or the string you input is too long, you can
GigabitEthernet0/0/0 current state : UP (ifindex: 3)
GigabitEthernet0/1/0 current state : Administratively DOWN (ifindex: 6)
GigabitEthernet0/1/1 current state : Administratively DOWN (ifindex: 7)
GigabitEthernet0/2/0 current state : Administratively DOWN (ifindex: 8)
Rx Power: -40.00dBm, Warning range: [-20.000, -3.000]dBm
Tx Power: -40.00dBm, Warning range: [-9.003, -3.000]dBm
GigabitEthernet0/2/1 current state : Administratively DOWN (ifindex: 9)
GigabitEthernet0/2/2 current state : Administratively DOWN (ifindex: 156)
GigabitEthernet0/2/3 current state : Administratively DOWN (ifindex: 157)
GigabitEthernet0/2/4 current state : Administratively DOWN (ifindex: 158)
GigabitEthernet0/2/5 current state : Administratively DOWN (ifindex: 159)
GigabitEthernet0/2/6 current state : Administratively DOWN (ifindex: 160)
GigabitEthernet0/2/7 current state : Administratively DOWN (ifindex: 161)
GigabitEthernet0/2/8 current state : Administratively DOWN (ifindex: 162)
GigabitEthernet0/2/9 current state : Administratively DOWN (ifindex: 163)
GigabitEthernet0/3/0 current state : UP (ifindex: 10)
Rx Power: -3.14dBm, Warning range: [-14.400, 0.499]dBm
Tx Power: -2.09dBm, Warning range: [-8.198, 0.499]dBm
GigabitEthernet0/3/1 current state : UP (ifindex: 11)
Rx Power: -5.74dBm, Warning range: [-14.400, 0.499]dBm
Tx Power: -3.13dBm, Warning range: [-8.198, 0.499]dBm
GigabitEthernet0/3/2 current state : UP (ifindex: 146)
Rx Power: -9.78dBm, Warning range: [-14.400, 0.499]dBm
Tx Power: -2.74dBm, Warning range: [-8.198, 0.499]dBm
GigabitEthernet0/3/3 current state : Administratively DOWN (ifindex: 147)
GigabitEthernet0/4/0 current state : UP (ifindex: 18)
Rx Power: -5.15dBm, Warning range: [-19.030, -3.000]dBm
Tx Power: -5.91dBm, Warning range: [-7.923, -3.922]dBm
GigabitEthernet0/4/1 current state : UP (ifindex: 19)
Rx Power: -5.27dBm, Warning range: [-19.030, -3.000]dBm
Tx Power: -5.95dBm, Warning range: [-8.010, -4.012]dBm
GigabitEthernet0/4/2 current state : UP (ifindex: 20)
Rx Power: -5.95dBm, Warning range: [-19.030, -3.000]dBm
Tx Power: -5.69dBm, Warning range: [-7.770, -3.769]dBm
GigabitEthernet0/4/3 current state : UP (ifindex: 21)
Rx Power: -5.37dBm, Warning range: [-19.030, -3.000]dBm
Tx Power: -6.20dBm, Warning range: [-8.198, -4.199]dBm
GigabitEthernet0/4/4 current state : UP (ifindex: 22)
Rx Power: -6.79dBm, Warning range: [-19.030, -3.000]dBm
Tx Power: -5.78dBm, Warning range: [-7.809, -3.809]dBm
GigabitEthernet0/4/5 current state : UP (ifindex: 23)
Rx Power: -5.56dBm, Warning range: [-19.030, -3.000]dBm
Tx Power: -6.17dBm, Warning range: [-8.164, -4.163]dBm
GigabitEthernet0/4/6 current state : UP (ifindex: 24)
Rx Power: -4.48dBm, Warning range: [-19.030, -3.000]dBm
Tx Power: -5.82dBm, Warning range: [-7.791, -3.790]dBm
GigabitEthernet0/4/7 current state : Administratively DOWN (ifindex: 25)
GigabitEthernet0/5/0 current state : UP (ifindex: 45)
Rx Power: -9.46dBm, Warning range: [-14.400, 0.499]dBm
Tx Power: -3.33dBm, Warning range: [-8.198, 0.499]dBm
GigabitEthernet0/5/1 current state : UP (ifindex: 46)
Rx Power: -6.01dBm, Warning range: [-14.400, 0.499]dBm
Tx Power: -3.27dBm, Warning range: [-8.198, 0.499]dBm
GigabitEthernet0/5/2 current state : UP (ifindex: 132)
Rx Power: -7.81dBm, Warning range: [-14.400, 0.499]dBm
Tx Power: -3.35dBm, Warning range: [-8.198, 0.499]dBm
GigabitEthernet0/5/3 current state : UP (ifindex: 133)
Rx Power: -4.26dBm, Warning range: [-14.400, 0.499]dBm
Tx Power: -3.37dBm, Warning range: [-8.198, 0.499]dBm
GigabitEthernet0/6/0 current state : UP (ifindex: 37)
Rx Power: -6.09dBm, Warning range: [-19.030, -3.000]dBm
Tx Power: -5.83dBm, Warning range: [-7.851, -3.849]dBm
GigabitEthernet0/6/1 current state : UP (ifindex: 38)
Rx Power: -10.05dBm, Warning range: [-19.030, -3.000]dBm
Tx Power: -6.12dBm, Warning range: [-8.164, -4.165]dBm
GigabitEthernet0/6/2 current state : UP (ifindex: 39)
Rx Power: -6.48dBm, Warning range: [-19.030, -3.000]dBm
Tx Power: -5.73dBm, Warning range: [-7.734, -3.734]dBm
GigabitEthernet0/6/3 current state : UP (ifindex: 40)
Rx Power: -7.57dBm, Warning range: [-19.030, -3.000]dBm
Tx Power: -6.02dBm, Warning range: [-8.074, -4.074]dBm
GigabitEthernet0/6/4 current state : UP (ifindex: 41)
Rx Power: -6.67dBm, Warning range: [-19.030, -3.000]dBm
Tx Power: -5.94dBm, Warning range: [-7.964, -3.963]dBm
GigabitEthernet0/6/5 current state : Administratively DOWN (ifindex: 42)
Rx Power: -40.00dBm, Warning range: [-19.030, -3.000]dBm
Tx Power: -40.00dBm, Warning range: [-7.923, -3.922]dBm
GigabitEthernet0/6/6 current state : Administratively DOWN (ifindex: 43)
Rx Power: -40.00dBm, Warning range: [-19.030, -3.000]dBm
Tx Power: -40.00dBm, Warning range: [-8.221, -4.221]dBm
GigabitEthernet0/6/7 current state : UP (ifindex: 44)
Rx Power: -9.02dBm, Warning range: [-18.996, -2.999]dBm
Tx Power: -5.84dBm, Warning range: [-8.999, -2.999]dBm
GigabitEthernet0/7/0 current state : UP (ifindex: 134)
Description: to ASGBGR10043702 GigabitEthernet0/7/0
Rx Power: -3.01dBm, Warning range: [-14.400, 0.499]dBm
Tx Power: -1.38dBm, Warning range: [-8.198, 0.499]dBm
GigabitEthernet0/7/1 current state : UP (ifindex: 135)
Description: to CSGBGR10060601 GigabitEthernet0/5/1
Rx Power: -6.00dBm, Warning range: [-14.400, 0.499]dBm
Tx Power: -3.17dBm, Warning range: [-8.198, 0.499]dBm
<ASGBGR10043701>
<ASGBGR10043701>q
首先,我指定“dis int | I igabitEthernet|ower”然后解析它,在它之后,我用另一个字符串作为键搜索“GigabitEthernet0/2/1 当前状态:”然后再次解析它,如果在第二个字符串之后它有以下 3 或 4 行,然后我需要阅读并解析,如果它没有以下 3 或 4 行,则跳过。
下面是我使用的代码,但它返回了重复的接口和错误的值。
flag =False
with open(logfile) as logs:
for nline, line in enumerate(logs,1):
if ('dis int | I igabitEthernet|ower' in line):
flag = True
RouterPwr = line
Router = line.replace('<', '').split('>')[0]
elif ('>q' in line):
flag = False
elif flag==True:
for nextline in range(1, 250):
linecs = nline + nextline
cs = getline(logs.name, linecs)
if (cs.startswith('GigabitEthernet') and ('current state : ' in cs)):
RouterInt = cs
Intfc = cs.split(' ')[0]
Cstate = cs.split('current state : ')[1]
RxPwr = RWarRange = RxLT = RxHT = TxPwr = TWarRange = TxLT = TxHT = Desc = '-'
for nextstep in range(1, 3):
linex = linecs + nextstep
x = getline(logs.name, linex)
if 'Rx Power:' in x:
RxPwr = x.split("Rx Power:")[1].split()[0]
RWarRange = x.split("Warning range:")[1].replace('[','').replace(']','')
RxLT = x.split("Warning range:")[1].replace('[','').replace(']','').split()[1]
RxHT = x.split("Warning range:")[1].replace('[','').replace(']','').split()[0]
elif 'Tx Power:' in x:
TxPwr = x.split("Tx Power:")[1].split()[0]
TWarRange = x.split("Warning range:")[1].replace('[', '').replace(']', '')
TxLT = x.split("Warning range:")[1].replace('[', '').replace(']', '').split()[1]
TxHT = x.split("Warning range:")[1].replace('[', '').replace(']', '').split()[0]
else:
continue
print(RouterInt)
else:
break
report.append({'Router':Router, 'Interface':Intfc, 'Current State':Cstate, 'Description':Desc, 'Rx Power':RxPwr, 'Rx low-Threshold':RxLT, 'Rx High-Threshold':RxHT, 'RX Range-Threshold':RWarRange, 'Tx Power':TxPwr, 'Tx Low-Threshold':TxLT, 'Tx High-Threshold':TxHT,'Tx Range-Threshold':TWarRange})
期望的输出:
解决方案
推荐阅读
- html - 将图像高度缩放到 Flex-Grown Wrapper
- jquery - jQuery UI datepicker 日期问题
- javascript - 未捕获的 ReferenceError:未定义 add_row_weekly
- testing - 如何选择在我的 helm 版本上运行的测试套件
- openssl - 为什么我收到错误 SSL 例程:SSL_write:bad length
- python - 元素试图在它出现之前被找到
- rust - 为数组赋值但值不变?
- php - PHPUnit 继承测试
- mysql - SQL 触发器更新另一个表中的旧值
- jenkins - 以编程方式更改 Jenkins 从配置不会反映在代理配置历史记录中