自己使用python语言开发了一个仿照Linux环境下搜索大文本的工具
python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
日志上下文搜索工具
用法: python search_log.py <日志文件> [-s 搜索字符串] [-c 上下文行数] [--encoding 编码]
示例: python search_log.py app.log -s "【鉴权通过:client=h2xxt5】" -c 5
"""
import argparse
import sys
import os
def main():
parser = argparse.ArgumentParser(description='在日志文件中搜索字符串并显示上下文')
parser.add_argument('logfile', help='日志文件路径')
parser.add_argument('-s', '--search', default='【鉴权通过:client=h2xxt5】',
help='要搜索的字符串(默认:【鉴权通过:client=h2xxt5】)')
parser.add_argument('-c', '--context', type=int, default=5,
help='显示匹配行前后的行数(默认:5)')
parser.add_argument('--encoding', default='utf-8',
help='文件编码(默认:utf-8)')
args = parser.parse_args()
# 检查文件是否存在
if not os.path.isfile(args.logfile):
print(f"错误:文件 '{args.logfile}' 不存在", file=sys.stderr)
sys.exit(1)
# 第一次扫描:记录所有匹配行的行号
matched_lines = []
try:
with open(args.logfile, 'r', encoding=args.encoding) as f:
for line_no, line in enumerate(f, start=1):
if args.search in line:
matched_lines.append(line_no)
except UnicodeDecodeError:
print(f"警告:使用 {args.encoding} 解码失败,尝试使用 'gbk' 编码...", file=sys.stderr)
try:
with open(args.logfile, 'r', encoding='gbk') as f:
for line_no, line in enumerate(f, start=1):
if args.search in line:
matched_lines.append(line_no)
except Exception as e:
print(f"错误:无法读取文件 - {e}", file=sys.stderr)
sys.exit(1)
except Exception as e:
print(f"错误:读取文件失败 - {e}", file=sys.stderr)
sys.exit(1)
if not matched_lines:
print(f"未找到包含 '{args.search}' 的行")
return
# 根据匹配行号计算需要输出的行号范围(合并重叠区间)
ranges = []
ctx = args.context
for line_no in matched_lines:
start = max(1, line_no - ctx)
end = line_no + ctx
if ranges and start <= ranges[-1][1] + 1: # 与上一个范围重叠或相邻
ranges[-1] = (ranges[-1][0], max(ranges[-1][1], end))
else:
ranges.append((start, end))
# 第二次扫描:输出指定范围内的行
print(f"\n找到 {len(matched_lines)} 个匹配项,上下文行数:{ctx}\n")
try:
with open(args.logfile, 'r', encoding=args.encoding) as f:
current_range_idx = 0
current_start, current_end = ranges[current_range_idx] if ranges else (0, 0)
for line_no, line in enumerate(f, start=1):
# 如果当前行号超过了当前范围,切换到下一个范围
while current_range_idx < len(ranges) and line_no > current_end:
current_range_idx += 1
if current_range_idx < len(ranges):
current_start, current_end = ranges[current_range_idx]
else:
break
# 如果当前行在当前范围内,输出
if current_range_idx < len(ranges) and current_start <= line_no <= current_end:
# 标记匹配行
marker = ' >>> ' if line_no in matched_lines else ' '
# 显示行号和内容(去除末尾换行)
print(f"{marker} {line_no:6d} | {line.rstrip()}")
except Exception as e:
print(f"错误:第二次读取文件失败 - {e}", file=sys.stderr)
sys.exit(1)
if __name__ == '__main__':
main()
使用方法
bash
py python_20260527_243313.py http-sms.logbackauth2.2026_06_04_11.log -s "hhhhh" -c 2
也可以把这个能力安装到windows全局下,全局调用
就是把你这个文件的当前目录放到系统环境下的Path参数里
如下


这样就可以全局调用 但是如果你直接调用脚本的话 系统是会直接打开这个文件的不是运行需要你在新建一个bat脚本
bash
@echo off
py "%~dp0deepseek_python_20260527_243313.py" %*
你搞好之后
bash
search http-sms.logbackauth2.2026_06_04_11.log -s "hhhhh" -c 2
在任何地方都可以直接调用了