widows环境 下使用python开发的仿照Linux的grep的能力

自己使用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

在任何地方都可以直接调用了

相关推荐
xiaoye-duck15 小时前
《Linux系统编程》Linux 系统多线程(一):线程概念(从虚拟地址空间与分页机制到优缺点解析)
linux·线程
起予者汝也15 小时前
Python 数据结构
开发语言·数据结构·python
LadenKiller15 小时前
2026年量化工具增量,放回回测模拟实盘阶段判断
人工智能·python
石一峰69915 小时前
驱动:私有数据为什么要在三个地方各挂一遍?
数据库·python·算法
国服第二切图仔15 小时前
05-构建与特性开关
linux·服务器·ubuntu
FREEDOM_X15 小时前
嵌入式——定时器工作原理
linux·c语言·单片机·嵌入式硬件·ubuntu
2601_9563198816 小时前
最新量化软件怎么选,先按能力短板匹配工具类型
人工智能·python
Tbisnic16 小时前
26.AI大模型:RNN、LSTM、GRU
人工智能·python·rnn·gru·大模型·llm·lstm
Thecozzy16 小时前
Skill和MCP和Subagent 的选择
linux·人工智能·ubuntu
七夜zippoe16 小时前
OpenClaw 实战:智能文档助手——从问答到生成的完整方案
人工智能·python·机器学习·openclaw·智能文档