经常需要在 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. DFS - leetcode [深度优先遍历]

    最短路径=>BFS    所有路径=>DFS 126. Word Ladder II BFS+DFS: BFS找出下一个有效的word进队 并记录step 更新两个变量:unordered ...

  2. C#第十三天

    1.单例模式 1)将构造函数私有化 2)提供一个静态方法,返回一个对象 3)创建一个单例 namespace 单例模式 { public partial class Form1 : Form { pu ...

  3. 优秀代码要求(转自http://www.cnblogs.com/brishenzhou/p/6284188.html)

    一段优秀的代码,它一般需要满足以下几个条件: #统一规范# 所有的代码,第一前提必须是统一规范,而常见的统一规范主要包括有以下内容: 1)统一编辑器规范 在团队开发中,我们并不对各个开发人员使用的编辑 ...

  4. php 分析

    php  code in D:\10\11\php test in D:\10\11\php\test issue 1: <html><head><title>标记 ...

  5. python修炼7----迭代器

    迭代器 -------------------------------------------------------------------------------- 充电小知识 1.yield-- ...

  6. php 设置白名单ip

    //检查白名单ip private function _checkAllowIp() { $allowIp = ['203.195.156.12']; $ip = $this->getIp(); ...

  7. haoce修改mysql

    修改时长余额 select * from sys_user_product up where up.user_id in(select u.id from sys_user u where login ...

  8. js中三目运算符和&& || 符的个人浅见

    这两天看到别人写的代码,感觉很牛逼,如下,大神请忽视 $(".lgn").on("click", function() { var a = {}; a.logi ...

  9. ubuntu 14.04 安装matlab2015b(破解版),具体软件请访问我的网盘~

    本文章转载自:http://www.cnblogs.com/ttzm/p/5475086.html 1.下载matlab的Unix版本:安装文件放在某目录下(如在Downloads下,则文件的完整路径 ...

  10. Linux格式化字符串

    > 常用 > 详细 给定的格式FORMAT 控制着输出,解释序列如下: %% 一个文字的 % %a 当前locale 的星期名缩写(例如: 日,代表星期日) %A 当前locale 的星期 ...