【问题标题】:grep a pattern in list of zip files recursively以递归方式grep zip文件列表中的模式
【发布时间】:2011-08-17 15:01:44
【问题描述】:

我在命令行上使用以下命令来获取模式匹配的行。

find . -name "*.gz"|xargs gzcat|grep -e "pattern1" -e "pattern2"

我现在只需要找到模式所在的文件名。 我如何在命令行上做到这一点?

grel -l没有用,因为我在grep之前使用xargs gzcat

【问题讨论】:

    标签: bash unix command-line grep


    【解决方案1】:

    在 bash 中,我会做这样的事情(未经测试):

    find . -name '*.gz' | while read f ; do gzcat $f | grep -q -e "pattern1" -e "pattern2" && echo $f ; done
    

    【讨论】:

      【解决方案2】:

      未经测试;里面的所有东西都找到了,所以如果你有大量的 gz 文件,你就不会遇到性能问题,因为一旦找到文件就运行每个 gzcat/grep,什么都不会输出:

      find . -iname '*.gz' -exec bash -c 'gzcat $1 | grep -q -e "pattern1" -e "pattern2" && echo $1' {} {} \;
      

      【讨论】:

        【解决方案3】:
        for i in $(find . -name "*.gz"); do gzcat $i|grep -qe "n1" -e "n2" && echo $i; done
        

        【讨论】:

        • 只是错过了这个想法。如果我明白了,我会写一个类似的命令。
        • 在没有 zgrep 的系统上运行良好,我没有 root 权限。谢谢你。在某些系统上,您可能必须使用 gcat 而不是 gzcat。
        【解决方案4】:

        检查您是否有可用的 zgrep。然后,如果是的话:

        find . -name '*.gz' -exec zgrep -l -e ".." -e ".." {} +
        

        如果你没有 - 好吧,只需从有它的机器上复制它(我使用的所有 linux 默认都有它) - 这是一个简单的 bash 脚本。

        【讨论】:

          【解决方案5】:

          ripgrep

          ripgrep为例,效率很高,尤其是对于大文件:

          rg -z -e "pattern1" -e "pattern2" *.gz
          

          或:

          rg -z "pattern1|pattern2" .
          

          或:

          rg -zf pattern.file .
          

          pattern.file 是一个文件,其中包含由换行符分隔的所有模式。

          -z/--search-zip 在压缩文件中搜索(如gzbz2xzlzma)。

          【讨论】:

            【解决方案6】:

            grep/zgrep/zegrep

            使用zgrepzegrep 使用压缩文件的未压缩内容(GNU/Linux 和 BSD/Unix)查找压缩文件中的模式。

            在 Unix 上,您还可以将grep(即BSD version)与-Z 一起使用,包括 macOS 上的-z

            几个例子:

            zgrep -E -r "pattern1|pattern2|pattern3" .
            zegrep "pattern1|pattern2|pattern3" **/*.gz
            grep -z -e "pattern1" -e "pattern2" *.gz # BSD/Unix only.
            

            注意:当你有globbing option enabled**递归检查文件,否则使用-r

            -R/-r/--recursive 递归搜索列出的子目录。

            -E/--extended-regexp 将模式解释为扩展的正则表达式(如egrep)。

            -Z (BSD), -z/--decompress (BSD/macOS) 强制 grep 表现为 zgrep

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-11-04
              • 2014-11-04
              • 1970-01-01
              • 2012-03-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多