如何在 zip 文件上使用 grep 命令

问题描述 投票:0回答:5

我想从 zip 文件中 grep 查找今天的日期。怎么才能做到这一点?

我有一个名为 sen2616.z 的 zip 文件 我想获取今天日期 09.02.2014 的所有数据

unix
5个回答
52
投票

请使用

zipgrep

zgrep
适用于 gz 文件,不适用于 zip 文件。


36
投票

就我而言,

zgrep
不适用于普通的
.zip
文件。我不得不使用
zipgrep
来代替。


11
投票

您可以使用

zgrep
来获得您想要的东西,方法是:

zgrep '09.02.2014' myfile.zip

请参阅

man zgrep
了解更多信息。


7
投票

zipgrep
仅适用于 zip 文件。 如果您想 grep 所有文件,而不仅仅是压缩文件,那么您可以使用 ugrep,它允许使用
-z
标志来执行此操作。


0
投票

这是我在 Python 中的快速实现。可以根据品味和需求进行增强,但具有在命令行上跨多个

.zip
(或
.jar
)文件并行化的优点:

import sys
import re
import zipfile
import posix
import multiprocessing

try:
    Pattern = re.compile(bytes(sys.argv[1], sys.getdefaultencoding()))
except IndexError:
    print('Usage:\n\t%s pattern file1.zip [file2.zip ...]', sys.argv[0])
    sys.exit(posix.EX_USAGE)
except re.error as e:
    print('Invalid search pattern "%s": %s' % (sys.argv[1], e))
    sys.exit(posix.EX_USAGE)

def grep(filename):
    global Pattern

    try:
        z = zipfile.ZipFile(filename)
    except (zipfile.BadZipfile) as e:
        print('%s: %s' % (filename, e))
        return

    for entry in z.infolist():
        # Older ZipFile versions do not have is_file-method
        try:
            if not entry.is_file():
                continue
        except AttributeError:
            if entry.is_dir():
                continue
        b = z.read(entry)
        if Pattern.search(b):
            print('%s: %s' % (filename, entry.filename))

if __name__ == "__main__":
    pool = multiprocessing.Pool()
    pool.map(grep, sys.argv[2:])
© www.soinside.com 2019 - 2024. All rights reserved.