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

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

相关推荐
爱和冰阔落1 小时前
Linux/Windows 双平台通关:YOLOv8 目标检测从模型选型到跨平台部署实战
linux·windows·yolo
小蜗牛的路1 小时前
Linux redhat 7在线安装docker、下载docker依赖、离线安装docker
linux·运维·docker
游戏开发爱好者81 小时前
Linux 自动上传 App Store Connect:把 IPA 上传流程接进CI工作流
linux·运维·ios·ci/cd·小程序·uni-app·iphone
郝学胜-神的一滴1 小时前
系统设计 014:缓存深度实战:如何用 Cache 优雅优化数据库读写?
java·数据库·python·缓存·oracle·php·软件构建
xuankuxiaoyao1 小时前
阶段案例——后台管理系统
java·linux·前端
Cloud_Shy6181 小时前
解读《Effective Python 3rd Edition》:从练气到老魔(第三章 Item 17 - 20)
开发语言·笔记·python
三品吉他手会点灯1 小时前
C语言学习笔记 - 42.数据类型 - scanf函数深度解析
c语言·开发语言·笔记·学习
Cx330❀1 小时前
【Linux网络】打破“一问一答”局限:从零构建全双工多线程UDP群聊系统
linux·运维·服务器·网络·网络协议·udp
ID_180079054732 小时前
TikTok 视频详情 & 列表 API 接口技术文档(带全套 JSON 样例・核心章节)
linux·windows·microsoft
隔窗听雨眠2 小时前
ORM框架选型指南:MyBatis与Hibernate的全面对比
java·开发语言·数据库