经常需要在 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文件的更多相关文章

  1. python查找读写文件

    import os ''' 跟据文件名称,后缀查找指定文件 path:传入的路径 filename:要查找的文件名 suffix:要查找的文件后缀 return :返回查找的文件路径 ''' file ...

  2. Python查找指定文件

    在当前目录以及当前目录的所有子目录下查找文件名包含指定字符串的文件,并打印出相对路径: import os testfiles = [] testfilepaths = [] L = len(os.p ...

  3. 【转】Python查找某文件夹下的所有excel文件

    # -*- coding: utf-8 -*- # author:baoshan import os dirname = r'D:\0.shenma\01.聊城资料\01.数据资料\02.聊城年鉴数据 ...

  4. Python实现对文件夹内文本文件递归查找

    平台:Win7 64 bit,IDLE Python 3.4.0 经常有这样的需求:在一个文本文件里查找特定字符串,这很好实现,用任何文本查看工具几乎都可以做到.而有的时候,想查找一个文件夹下的所有文 ...

  5. python 查找文件内容

    输入查找的文件夹路径,要查找的内容关键字(可以指定多个),要查找的文件类型(可以是多个),搜索出符合条件的文件,并记录所有符合条件的行号及行内容. 写的感觉有点冗余,但好歹还能使用^-^,主要是方便手 ...

  6. python实现在目录中查找指定文件的方法

    python实现在目录中查找指定文件的方法 本文实例讲述了python实现在目录中查找指定文件的方法.分享给大家供大家参考.具体实现方法如下: 1. 模糊查找 代码如下: import os from ...

  7. 使用二分法查找mobile文件中区号归属地

    #!/usr/bin/env python #coding:utf-8 ''' Created on 2015年12月8日 @author: DL @Description: 使用二分法查找mobil ...

  8. Python操作Zip文件

    Python操作Zip文件 需要使用到zipfile模块 读取Zip文件 随便一个zip文件,我这里用了bb.zip,就是一个文件夹bb,里面有个文件aa.txt. import zipfile # ...

  9. python自定义库文件路径

    各有各的小烦恼,各有的小期待 这是人家私事,不要大嘴巴 在Pycharm中import whois时,总是失败 原因是安装了python3.x相关操作过程,将环境变量path中关于Python的配置c ...

随机推荐

  1. JS定时器设置、快速取消

    1.首先定义自己的方法 function test() { alert("开始"); } 2.在定时器中使用 setInterval("test()",1000 ...

  2. WebStorm和IntelliJIEDA软件注册码网站(手动填写)

    很多人都发现 http://idea.lanyus.com/ 不能激活了 很多帖子说的 http://15.idea.lanyus.com/ 之类都用不了了 选择 License server (20 ...

  3. chrome手动添加拓展

    https://www.crx4chrome.com/crx/978/ Free Download Postman REST Client CRX 0.8.4.19 for ------------- ...

  4. HDU 2176 取(m堆)石子游戏 尼姆博弈

    题目思路: 对于尼姆博弈我们知道:op=a[1]^a[2]--a[n],若op==0先手必败 一个简单的数学公式:若op=a^b 那么:op^b=a: 对于第i堆a[i],op^a[i]的值代表其余各 ...

  5. mysql索引类型-形式-使用时机-不足之处--注意事项

    一.索引的类型 1.普通索引   增加 create  index  index_name on table(colume(length));                       例子:cre ...

  6. 360度角转AS3角度

    var ang:Number=400; ang=ang%360; //as3角指0~180,0~-180的角 //1. 360度角转as3角 if(ang>180)ang-=360; else ...

  7. Windows下Discuz搭建论坛过程

    搭建环境:Win7 + XAMPP5.5 + Discuz3.2 GBK 官方论坛下载安装包,解压,把upload文件夹拷贝到网站文档根目录(例如我的为:D:\IT\XAMPP5.5\htdocs\) ...

  8. SQL learning

    一.创建和删除数据库 1.创建用户 //创建用户且置密码,在MySQL中行,但在Oracle中行  ----必须在超级管理员身份下操作 create user hncu identified by ' ...

  9. 常见编程语言对REPL支持情况小结[转]

    文章转载自http://www.nowamagic.net/librarys/veda/detail/2462 最近跟一个朋友聊起编程语言的一些特性,他有个言论让我略有所思:“不能REPL的都是渣”. ...

  10. 关于wcf中一些重要词语解释

    From a distant view, the service offers an