首页 > 解决方案 > 如何找到指定的字符串并解析接下来的 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})

期望的输出: 期望的输出

标签: python-3.xparsing

解决方案


推荐阅读