Windows 下的 grep 工具

admin 2024年1月31日21:15:55评论14 views字数 2247阅读7分29秒阅读模式

Windows 下自带的 find 和 findstr 命令可以起到基本的过滤作用,但效果不是很好,也不支持正则表达式。Linux 下的 grep 功能强大,但迁移到 windows 的版本,在 cmd 下会遇到编码问题,无法处理中文。

比如:

Windows 下的 grep 工具

于是打算自己实现一个简版的 grep ,首先要能处理正则表达式和普通字符串,其次支持在 windows cmd 下运行,能够正确处理中文。

最终效果如下:

Windows 下的 grep 工具

简版的 mygrep 工具支持字符串子串匹配和正则匹配两种模式,不带选项的为子串匹配,带 -e 参数的为正则匹配。mygrep 工具的帮助文档为:

C:> mygrep -husage: mygrep [-h] [-e] pattern [ file]类似于grep的命令行工具,按行进行匹配。positional arguments:  pattern      搜索模式,可以是正则表达式或子串  file         要搜索的文件,如果未提供则从标准输入读取options:  -h, --help   show this help message and exit  -e, --regex  使用正则表达式进行匹配

为了既能在 Windows cmd 下执行,同时也能在 Windows git-bash 中执行,加了环境变量的判断条件,如果是在 git-bash 环境下执行,则将标准输出编码改为 utf-8 :

import platformdef change_default_encoding():    '''判断是否在 windows git-bash 下运行,是则使用 utf-8 编码'''    if platform.system() == 'Windows':        terminal = os.environ.get('TERM')        if terminal and 'xterm' in terminal:            sys.stdout.reconfigure(encoding='utf-8')

这里用到了 TERM 环境变量,如果是在 git-bash 环境,该变量值为 xterm。Windows 下的 Python 解析器的默认标准输出编码为 GB2312,git-bash 环境下 Python 程序输出中文会出乱码。将标准输出默认编码改为 utf-8 后,git-bash 下则不会再出现中文乱码。

mygrep 代码如下:

import argparseimport reimport sysimport platformdef change_default_encoding():    '''判断是否在 windows git-bash 下运行,是则使用 utf-8 编码'''    if platform.system() == 'Windows':        terminal = os.environ.get('TERM')        if terminal and 'xterm' in terminal:            sys.stdout.reconfigure(encoding='utf-8')def grep(pattern, file, use_regex):    """    类似于grep的函数,对每一行文本进行匹配,如果匹配则打印相应行,否则跳过。    参数:    pattern (str): 搜索模式,可以是正则表达式或子串    file: 文件对象或标准输入    use_regex (bool): 是否使用正则表达式匹配    返回:    None    """    for line in file:        if use_regex:            # 如果使用正则表达式匹配,使用re.search            match = re.search(pattern, line)        else:            # 否则,使用普通的字符串查找            match = pattern in line        # 如果匹配成功,打印相应行        if match:            print(line, end='')def main():    change_default_encoding()    # 创建命令行解析器    parser = argparse.ArgumentParser(description="类似于grep的命令行工具,按行进行匹配。")    # 添加命令行参数    parser.add_argument("-e", "--regex", action="store_true",                        help="使用正则表达式进行匹配")    parser.add_argument("pattern", help="搜索模式,可以是正则表达式或子串")    parser.add_argument("file", nargs='?', type=argparse.FileType('r'), default=sys.stdin,                        help="要搜索的文件,如果未提供则从标准输入读取")    # 解析命令行参数    args = parser.parse_args()    try:        # 调用grep函数,逐行处理文本        grep(args.pattern, args.file, args.regex)    except Exception as e:        print(f"发生错误: {e}")        sys.exit(1)if __name__ == "__main__":    main()

也可到我的 github 项目中下载源码:

https://github.com/hyang0/ip_notes

如果是在 Windows cmd 下使用,可以使用 pyinstaller 将其编译为 exe 可执行文件。

pyinstaller --onefile mygrep.py

将编译后的可执行文件 mygrep.exe 放至 PATH 环境变量下的目录,这样就可以在 cmd 命令行中调用 mygrep 工具了。

Windows 下的 grep 工具

全文完。

如果转发本文,文末务必注明:“转自微信公众号:生有可恋”。

原文始发于微信公众号(生有可恋):Windows 下的 grep 工具

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年1月31日21:15:55
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Windows 下的 grep 工具http://cn-sec.com/archives/2445302.html

发表评论

匿名网友 填写信息