如何在Python中筛选两个时间戳之间的行
我遇到了一个问题,我有一个日志文件,想要逐行读取,但为了减少行数,我想过滤掉两个时间戳之间的行!
在awk中的例子:
find all between two patterns: pattern1 = 2012-10-23 14, pattern2 = 2012-10-23 16
awk '/2012-10-23 14/{P=1;next}/2012-10-23 16/{exit} P' server.log
或者用egrep和一个模式:
egrep "2012-10-23 (1[4-6]:[0-5][0-9])" server.log
上面的awk代码会让我只得到这两个时间戳之间的行。
我该如何在Python中做到这一点,而不执行任何系统命令或使用awk、grep等,只用Python的正则表达式呢?
提前谢谢!
2 个回答
0
我觉得@Kent的帖子只有在假设时间戳在每行的开头时才有效。而你的AWK / egrep代码要求的功能更通用。
下面的代码应该可以工作:
- 不管你要找的内容在行中的哪个位置
- 不管日志中的行是否正确排序(不过这通常是可以假设的 ;-))
- 作为一个非阻塞的生成器,处理结果时会逐步输出,而不会占用太多内存。
代码结构更通用,以便你可以进行进一步的修改。
import re def log_lines(yourFile, regexp): rxp = re.compile(regexp) with open(yourFile) as f: for line in f.readlines(): if rxp.search(line): yield line for line in log_lines("yourFile", "2012-10-23 1[4-6]"): print line
继续使用Python吧,它会让你上瘾的 ;-)
0
这是你 awk 代码的一对一翻译:
with open('yourFile') as f:
lines = f.read().splitlines()
for l in lines:
if l.startswith('2012-10-23 14'):
p=1
elif l.startswith('2012-10-23 16'):
p=0
break
if p: print l
这段代码会在第一行以 2012-10-23 14 ...
开头时开始输出,并在第一行以 2012-10-23 16..
开头时停止打印。 (和你的 awk 代码效果一样)