我们知道,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 压缩文件中查找指定字符串内容,需要耐心等待!

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐