【发布时间】:2019-05-30 02:05:22
【问题描述】:
我正在解析日志文件,其中包含有关许多作业的事件的行,由作业 ID 标识。我正在尝试在 Python 中的两个模式之间获取日志文件中的所有行。
我已经阅读了这篇非常有用的帖子How to select lines between two patterns?,并且已经解决了awk 的问题,如下所示:
awk '/pattern1/,/pattern2/' file
由于我在 Python 脚本中处理日志信息,因此我使用 subprocess.Popen() 来执行该 awk 命令。我的程序可以运行,但我想单独使用 Python 来解决这个问题。
我知道re 模块,但不太了解如何使用它。日志文件已经被压缩到 bz2,所以这是我打开 .bz2 文件并找到两个模式之间的行的代码:
import bz2
import re
logfile = '/some/log/file.bz2'
PATTERN = r"/{0}/,/{1}/".format('pattern1', 'pattern2')
# example: PATTERN = r"/0001.server;Considering job to run/,/0040;pbs_sched;Job;0001.server/"
re.compile(PATTERN)
with bz2.BZ2File(logfile) as fh:
match = re.findall(PATTERN, fh.read())
但是,match 是空的(fh.read() 不是!)。使用re.findall(PATTERN, fh.read(), re.MULTILINE) 无效。
在re.compile() 之后使用re.DEBUG 会显示很多行
literal 47
literal 50
literal 48
literal 49
literal 57
两个说
any None
我可以使用像python print between two patterns, including lines containing patterns 这样的循环来解决问题,但我会尽可能避免嵌套的 for-if 循环。我相信re 模块可以产生我想要的结果,但我不是如何使用它的专家。
我使用的是 Python 2.7.9。
【问题讨论】:
-
您的
/0001.server;Considering job to run/,/0040;pbs_sched;Job;0001.server/不包含换行符,而要使用awk您必须拥有它们,那么什么是现实日志文件内容? -
那是正则表达式,不是日志文件。对于 awk,我会使用
awk '/0001.server;Considering job to run/,/0040;pbs_sched;Job;0001.server/' logfile,结果是日志文件中包含的这两个模式之间的行。我可以发布日志,但我最好匿名一些字符串,因为它包含与客户相关的信息。 -
好的,现在更清楚了