我们知道,Linux 是支持多种的打包技术的,其中包括了 zip 压缩。最近呢,遇到了在 zip 压缩文件中搜索特定的字符串内容的需求。我试图从 grep、sed 及 awk 等命令中尝试实现这种搜索特定字符串的需求,可测试结果不尽人意。折腾了半天发现 Linux 有提供这种命令的,那就是 zipgrep 命令或 zgrep 命令,在此记录一下。
1、准备工作
首先,新建三个测试要用的 txt 文件,test1.txt、test2.txt、test3.txt,我用下面方式创建和追加文本文件的内容:
- echo "hello" >test1.txt
- echo "very nice" >>test1.txt
- echo "lalalala" >>test1.txt
- echo "yyds" >>test1.txt
-
- echo "belive myself" >test2.txt
- echo "come on" >>test2.txt
- echo "yesyesyes" >>test2.txt
-
- 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 | 匹配整行 |
动手试试,如下:
- # 查找"lala"字符串,并列出所在文件的行号
- [xxxxxxxxxx@localhost ~]$ zipgrep -n "lala" mytest.zip
- test1.txt:3:lalalala
- # 取反
- [xxxxxxxxxx@localhost ~]$ zipgrep -v "lala" mytest.zip
- test1.txt:hello
- test1.txt:very nice
- test1.txt:yyds
- test2.txt:belive myself
- test2.txt:come on
- test2.txt:yesyesyes
- test3.txt:good bye~
同时,很好奇 zgrep 命令与 zipgrep 命令有什么区别呢?试试就知道了:
- # 查找"lala"字符串,并列出所在文件的行号
- [xxxxxxxxxx@localhost ~]$ zgrep -n "lala" mytest.zip
- 3:lalalala
- # 取反
- [xxxxxxxxxx@localhost ~]$ zgrep -v "lala" mytest.zip
- hello
- very nice
- yyds
果然,还是 zipgrep 命令搜索字符串的效果好些!
3、升级下搜索字符串的难度
实际工作中,服务器上不可能只有一个 zip 文件的,那么我要在多个 zip 文件中查找相同指定的字符串内容该怎么办呢?把 mytest.zip 复制多份,尝试了下面这些查找方式,都是错误的:
- # 错误方式1
- zipgrep -n "yyds" *.zip
- # 错误方式2
- 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 压缩文件中查找指定字符串内容,需要耐心等待!