匹配一个大日志文件中的两行并显示它们之间的内容

2024-03-28 14:17:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个很大的日志文件,里面有很多事情。所需的是获取日志文件中两行之间的内容。你知道吗

示例:

----------------------------------------
-- ServiceDataBlock (SDB):{MO}:
  > From channel# ..... [111]
  > (Orig)Ton, TP_OA .. [91][1234567891234]
  > (Dest)Ton, TP_DA .. [A0][12345]
  > TP_PID, TP_DCS .... [00][00]
  > TP_SCTS ........... []
  > TP_UserDataHdr .... []
  > TP_UserData ....... {3}[yes]
----------------------------------------

-- ServiceDataBlock (SDB):{MO}:行和第> TP_UserData ....... {3}[yes]行之间的内容是动态的。你知道吗

我只想获取(Orig)Ton, TP_OA .. [91][1234567891234]TP_UserData ....... {3}[yes]之间的值:-)

请注意,还有许多其他的东西定义了相同的-- ServiceDataBlock (SDB):{MO}:,但是块中没有TP_UserData ....... {3}[yes]。你知道吗

有人能帮忙吗?我试过使用regex,grep,sed和awk。你知道吗

我需要CSV或Excel格式的输出。你知道吗


Tags: 文件from示例内容channel事情yesdest
3条回答

下面是一个简单的基于状态的解析器。它没有经过很好的测试,可能会对日志文件的格式做出一些不正确的假设。不过,它应该能帮助你开始。你知道吗

def process_log(path):
    contents = []
    with open(path) as stream:
        state = 0
        line = ''
        block = None
        while line is not None:
            try:
                if not line:
                    line = next(stream)
            except StopIteration:
                line = None
            else:
                line = line.strip()
                if state == 0:
                    if line.startswith('  ServiceDataBlock'):
                        block = []
                        state = 1
                    line = ''
                    continue
                elif state >= 1:
                    if line.startswith('>'):
                        line = line.lstrip('> ')
                        if not line.startswith('From channel#'):
                            block.append(line)
                            if line.startswith('TP_UserData '):
                                state = 2
                        line = ''
                        continue
            if state == 2:
                contents.append(block)
            state = 0
    return contents

谢谢你们。你知道吗

我知道我不需要这里的现成代码:-)

下面是我使用grep所取得的成果:-)

grep -Po "(.*Orig.*\[(234.*)\])\n(.*)\n(.*)\n(.*)\n(.*)\n(.*yes.*)" filename

这实际上会帮助我得到数据,我已经做了更多的工作,以获得确切的东西,但这是目前的工作。你知道吗

我会张贴完整的答案时,这是完成。你知道吗

再次感谢!你知道吗

perl方法:

perl -ane 'print if /  ServiceDataBlock/ .. /TP_UserData /' filename

相关问题 更多 >