• 4、Linux:如何在zip压缩文件中搜索指定内容


    我们知道,Linux 是支持多种的打包技术的,其中包括了 zip 压缩。最近呢,遇到了在 zip 压缩文件中搜索特定的字符串内容的需求。我试图从 grep、sed 及 awk 等命令中尝试实现这种搜索特定字符串的需求,可测试结果不尽人意。折腾了半天发现 Linux 有提供这种命令的,那就是 zipgrep 命令或 zgrep 命令,在此记录一下。

    1、准备工作

    首先,新建三个测试要用的 txt 文件,test1.txt、test2.txt、test3.txt,我用下面方式创建和追加文本文件的内容:

    1. echo "hello" >test1.txt
    2. echo "very nice" >>test1.txt
    3. echo "lalalala" >>test1.txt
    4. echo "yyds" >>test1.txt
    5. echo "belive myself" >test2.txt
    6. echo "come on" >>test2.txt
    7. echo "yesyesyes" >>test2.txt
    8. echo "good bye~" >test3.txt

    接着,打包成 .zip 格式的压缩包

    zip mytest.zip test*.txt

    2、zxx系列命令的尝试

    经了解,zip 文件也支持使用 zcat、zmore、zless、zgrep/zipgrep 等命令的,动手尝试下:

     可以看到,zcat、zmore、zless 这三个命令和 cat、more、less 的用法是相同的。zcat 会查询单个 zip 文件的所有内容,且提示当前的 mytest.zip 还有其他的文件(忽略展示);zmore 仍是按当前一屏内容展示,是支持分页的;zless 也是支持分页展示内容的(请注意,退出分页模式按 q 键即可)。这三个命令明显不是我需要的,那只有 zgrep/zipgrep 命令了。

    zipgrep 命令为例,其语法格式如下:

    zipgrep [参数选项] [zip文件]

    参数选项:

    -b打印匹配行距文件头部的偏移量,以字节为单位
    -c只输出匹配行的数量
    -h查询多文件时不显示文件名
    -i搜索时忽略大小写
    -l只列出符合匹配的文件名,不列出具体的匹配行
    -n列出所有的匹配行,显示行号
    -o与-b结合使用,打印匹配的词据文件头部的偏移量,以字节为单位
    -q禁止输出任何结果,已退出状态表示搜索是否成功
    -r递归搜索
    -s不显示不存在、没有匹配文本的错误信息
    -v显示不包含匹配文本的所有行
    -w匹配整词
    -x匹配整行

    动手试试,如下:

    1. # 查找"lala"字符串,并列出所在文件的行号
    2. [xxxxxxxxxx@localhost ~]$ zipgrep -n "lala" mytest.zip
    3. test1.txt:3:lalalala
    4. # 取反
    5. [xxxxxxxxxx@localhost ~]$ zipgrep -v "lala" mytest.zip
    6. test1.txt:hello
    7. test1.txt:very nice
    8. test1.txt:yyds
    9. test2.txt:belive myself
    10. test2.txt:come on
    11. test2.txt:yesyesyes
    12. test3.txt:good bye~

    同时,很好奇 zgrep 命令与 zipgrep 命令有什么区别呢?试试就知道了:

    1. # 查找"lala"字符串,并列出所在文件的行号
    2. [xxxxxxxxxx@localhost ~]$ zgrep -n "lala" mytest.zip
    3. 3:lalalala
    4. # 取反
    5. [xxxxxxxxxx@localhost ~]$ zgrep -v "lala" mytest.zip
    6. hello
    7. very nice
    8. yyds

    果然,还是 zipgrep 命令搜索字符串的效果好些!

    3、升级下搜索字符串的难度

    实际工作中,服务器上不可能只有一个 zip 文件的,那么我要在多个 zip 文件中查找相同指定的字符串内容该怎么办呢?把 mytest.zip 复制多份,尝试了下面这些查找方式,都是错误的:

    1. # 错误方式1
    2. zipgrep -n "yyds" *.zip
    3. # 错误方式2
    4. zipgrep -n "yyds" mytest.zip jchy.zip xxyz.zip

    那只能是有 for 循环实现了,尝试一下:

    for i in `ls *.zip`;do zipgrep -n "yyds" $i; done

    最后

    zipgrep 命令在 zip 压缩文件中查找指定的字符串内容,并通过 for 循环可以实现从多个 zip 压缩文件中查找。但经过实际的测试发现,多个 zip 压缩文件的字符串查找效率还是挺慢的。假设一个 zip 压缩文件有 100w 的数据量,一分钟完成的查找才达到15个左右的 zip 压缩文件。对于上亿数据量的 zip 压缩文件中查找指定字符串内容,需要耐心等待!

  • 相关阅读:
    SAP UI5 Form 和 Simple Form 的设计规范
    万字长文详解对账系统设计,推荐收藏
    1024程序员节 | C++ NOIP2014 普及组 T3 螺旋矩阵
    系分 - 项目管理
    Day38 性能测试理论
    dotnet7 aot编译实战
    使用windows钩子(HOOK)实现DLL注入
    Linux 下搭建 Hive 环境
    WEB自动化测试(6)—— 命令行运行Cypress
    计算机网络4小时速成:计算机网络基础,计网组成,计网分类,性能指标,标准化组织,计网结构模型,五层模型
  • 原文地址:https://blog.csdn.net/qq_29119581/article/details/125495053