Python 查找binlog文件
经常需要在 binlog 中查找一些日志信息,于是写了一个简单的脚本。对于非常巨大的 binlog 文件,该脚本可能会速度慢,毕竟还是用的 list,暂时没想到好办法。
详细看代码:
#/usr/bin/python #2016-04-12 #search string in the binlogs #usage:
#put this file into binlog-dir,exec as:
#"python test.py 111 123 update" or
#"python test.py 111 123 update and insert" or
#"python test.py 111 123 update or delete"
#the nums are the binlog-num. import sys
import subprocess def find_str(files):
for file in files:
comm = "mysqlbinlog {0}".format(file)
lines = subprocess.Popen(comm, shell=True, stdout=subprocess.PIPE)
lines = lines.stdout.readlines()
for line in lines:
line = line.lower()
if len(sys.argv) == 4:
if sys.argv[3] + ' ' in line:
yield line
elif len(sys.argv) == 6 and sys.argv[4] == "and":
if sys.argv[3] + ' ' in line and sys.argv[5] + ' ' in line:
yield line
elif len(sys.argv) == 6 and sys.argv[4] == "or":
if sys.argv[3] + ' ' in line or sys.argv[5] + ' ' in line:
yield line if __name__ == "__main__":
start = sys.argv[1]
end = sys.argv[2]
files = ["updatelog.{0:06d}".format(i) for i in range(int(start), int(end)+1)] f = find_str(files)
for i in f:
print(i)
第二次改进版本,由于 py2 不支持 yield from 语句,gen_concatenate() 可能有点绕;详细看代码:
#/usr/bin/python #-- #search string in the binlogs #usage:
#put this file into binlog-dir,exec as "python test.py 111 123 update" or "python test.py 111 123 update and insert" or "python test.py 111 123 update or delete"
#the nums are the binlog-num. import sys
import subprocess def find_str(files):
print(sys.argv)
for file in files:
comm = "mysqlbinlog {0}".format(file)
lines = subprocess.Popen(comm, shell=True, stdout=subprocess.PIPE)
lines = lines.stdout.readlines()
yield lines #此处返回的是生成器对象 def gen_concatenate(lines):
#将多个生成器对象迭代返回
for i in lines:
for it in i:
yield it def gen_grep(lines):
for line in lines:
line = line.lower()
if len(sys.argv) == :
if sys.argv[] + ' ' in line:
yield line
elif len(sys.argv) == and sys.argv[] == "and":
if sys.argv[] + ' ' in line and sys.argv[] + ' ' in line:
yield line
elif len(sys.argv) == and sys.argv[] == "or":
if sys.argv[] + ' ' in line or sys.argv[] + ' ' in line:
yield line if __name__ == "__main__":
start = sys.argv[]
end = sys.argv[]
files = ["updatelog.{0:06d}".format(i) for i in range(int(start), int(end)+)] f = find_str(files)
lines = gen_concatenate(f)
greplines = gen_grep(lines)
for i in greplines:
print(i)
脚本1理解起来更加容易,将实现功能全部封装在一个函数体内;
更新:
使用了 re 正则匹配,有时候日志里面记录的表名是带反引号的,比如`user`这样,见代码:
#/usr/bin/python #2016-04-27 #search string in the binlogs #usage:
#put this file into binlog-dir,exec as "python test.py 111 123 update" or "python test.py 111 123 update and insert" or "python test.py 111 123 update or delete"
#the nums are the binlog-num. import sys
import subprocess
import re def find_str(files):
print(sys.argv)
for file in files:
comm = "mysqlbinlog {0}".format(file)
lines = subprocess.Popen(comm, shell=True, stdout=subprocess.PIPE)
lines = lines.stdout.readlines()
yield lines def gen_concatenate(lines):
for i in lines:
for it in i:
yield it def gen_grep(lines):
for line in lines:
line = line.lower()
if len(sys.argv) == 4:
# if sys.argv[3] + ' ' in line:
# yield line
str1 = sys.argv[3]
str1_match = re.search(str1, line, re.I)
if str1_match is not None:
yield line
elif len(sys.argv) == 6 and sys.argv[4] == "and":
# if sys.argv[3] + ' ' in line and sys.argv[5] + ' ' in line:
# yield line
str1 = sys.argv[3]
str2 = sys.argv[5]
if re.search(r'\b{}\b'.format(str1), line, re.I) is not None and re.search(r'\b{}\b'.format(str2), line, re.I):
yield line
elif len(sys.argv) == 6 and sys.argv[4] == "or":
# if sys.argv[3] + ' ' in line or sys.argv[5] + ' ' in line:
# yield line
str1 = sys.argv[3]
str2 = sys.argv[5]
if re.search(r'\b{}\b'.format(str1), line, re.I) is not None and re.search(r'\b{}\b'.format(str2), line, re.I):
yield line if __name__ == "__main__":
start = sys.argv[1]
end = sys.argv[2]
files = ["updatelog.{0:06d}".format(i) for i in range(int(start), int(end)+1)] f = find_str(files)
lines = gen_concatenate(f)
greplines = gen_grep(lines)
for i in greplines:
print(i) search.py
search.py
Python 查找binlog文件的更多相关文章
- python查找读写文件
import os ''' 跟据文件名称,后缀查找指定文件 path:传入的路径 filename:要查找的文件名 suffix:要查找的文件后缀 return :返回查找的文件路径 ''' file ...
- Python查找指定文件
在当前目录以及当前目录的所有子目录下查找文件名包含指定字符串的文件,并打印出相对路径: import os testfiles = [] testfilepaths = [] L = len(os.p ...
- 【转】Python查找某文件夹下的所有excel文件
# -*- coding: utf-8 -*- # author:baoshan import os dirname = r'D:\0.shenma\01.聊城资料\01.数据资料\02.聊城年鉴数据 ...
- Python实现对文件夹内文本文件递归查找
平台:Win7 64 bit,IDLE Python 3.4.0 经常有这样的需求:在一个文本文件里查找特定字符串,这很好实现,用任何文本查看工具几乎都可以做到.而有的时候,想查找一个文件夹下的所有文 ...
- python 查找文件内容
输入查找的文件夹路径,要查找的内容关键字(可以指定多个),要查找的文件类型(可以是多个),搜索出符合条件的文件,并记录所有符合条件的行号及行内容. 写的感觉有点冗余,但好歹还能使用^-^,主要是方便手 ...
- python实现在目录中查找指定文件的方法
python实现在目录中查找指定文件的方法 本文实例讲述了python实现在目录中查找指定文件的方法.分享给大家供大家参考.具体实现方法如下: 1. 模糊查找 代码如下: import os from ...
- 使用二分法查找mobile文件中区号归属地
#!/usr/bin/env python #coding:utf-8 ''' Created on 2015年12月8日 @author: DL @Description: 使用二分法查找mobil ...
- Python操作Zip文件
Python操作Zip文件 需要使用到zipfile模块 读取Zip文件 随便一个zip文件,我这里用了bb.zip,就是一个文件夹bb,里面有个文件aa.txt. import zipfile # ...
- python自定义库文件路径
各有各的小烦恼,各有的小期待 这是人家私事,不要大嘴巴 在Pycharm中import whois时,总是失败 原因是安装了python3.x相关操作过程,将环境变量path中关于Python的配置c ...
随机推荐
- WordPress网站加速优化,一键免费使用七牛CDN插件
利用wordpress搭建网站是个人建站的主流方案,我曾分享过wordpress网站加速优化必做的十件事,帮助了不少个人站长.今天介绍帮助wordpress网站提升速度至少10倍的免费CDN加速插件: ...
- 关于Windows Boot Manager、Bootmgfw.efi、Bootx64.efi、bcdboot.exe 的详解
1. http://bbs.wuyou.com/forum.php?mod=viewthread&tid=303679&fromuid=396698
- 学习node的REPL
REPL: read eval print loop 支持 多行代码 编辑模式,即 识别{} () 为代码块. 在repl中快速查看 对象的属性 gl = global repl command .h ...
- 2px边框,4分之1内边框实现选中功能实现
有时候我们要实现如下选中效果: 我给出一种解决办法: 首先选中的时候,加一个class(active),未选中的全部加一个class(inactive),外层给一个1px border,每个选项给一个 ...
- Date对象 识记
1.Date 对象创建 var myDate=new Date() 2.Date 对象属性 constructor pototype 3.Date 对象方法 Date() ...
- Sql Server尝试读取或写入受保护的内存。这通常指示其他内存已损坏
今日遇到这样一个问题,用vs2010调试C#代码时,只要代码一运行到跟数据库关联的地方时,编译器就报错误,给的提示如:调试器已附加,要继续需要分离什么的,咋一看还以为是vs中调试器设置的问题,可后来仔 ...
- pythonRedis 订阅功能实现
两天机器做,host要写订阅主机的ip,客户端发消息,服务端订阅消息 cat redis_connector.py #!/usr/bin/env python__author__ = 'Q.Li'im ...
- date,datetime,timestamp 的区别
date 表示年月日,如YY-MM-DD datetime 表示年月日和时间信息,如YY-MM-DD HH:MM:SS datestamp 和datetime表示的信息相同,但时间范围不同 时间范围 ...
- dom4j操作xml文档
java Dom4j解析XML文件 标签(空格分隔):java进阶 xml文档: <?xml version="1.0" encoding="UTF-8" ...
- CodeForces 700B Connecting Universities
统计每一条边的贡献,假设$u$是$v$的父节点,$(u,v)$的贡献为:$v$下面大学个数$f[v]$与$2*k-f[v]$的较小值. #pragma comment(linker, "/S ...