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

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

相关推荐
用户83562907805114 小时前
Python 操作 PDF 附件:添加、查看与管理指南
后端·python
宇宙之一粟1 天前
乐企版式文件生成平台
java·后端·python
学测绘的小杨2 天前
CompassFusion:一个从 GNSS 到 GNSS/INS 组合导航的独立工程包
python
Web3探索者2 天前
可视化服务器管理和传统命令行区别是什么?新手教程:Linux 运维到底该用图形界面还是 SSH 命令行?
linux·ssh
zylyehuo2 天前
Linux系统中网线与USB网络共享冲突
linux
zzzzzz3102 天前
当产品经理说这个很简单:我用Python自动化处理奇葩需求的实战指南
python·pycharm·产品经理
雪隐2 天前
个人电脑玩AI-06让5060 Ti给你打工——不光能画画,Qwen3-TTS还能学人说话,连我老板都信了!
人工智能·后端·python
兵慌码乱2 天前
面向桌面端的资产管理系统分层架构设计与核心模块实现
python·系统架构·sqlite·pyqt5·数据库设计·桌面应用开发·mvc架构
hboot2 天前
AI工程师第三课 - 机器学习基础
python·scikit-learn·kaggle
顾林海3 天前
Agent入门阶段-编程基础-Python:流程控制
python·agent·ai编程