【问题标题】:Recursive grep for gz files search string from an output stringgz文件的递归grep从输出字符串中搜索字符串
【发布时间】:2019-06-09 11:35:34
【问题描述】:

我正在尝试使用 gz 文件夹在递归搜索中从字符串的输出中搜索字符串。

我正在使用仅有效的命令:

find . -name "*.gz" -exec zgrep -H 'PATTERN' \{\} \;

来自find string inside a gzipped file in a folder

我怎样才能做到这一点,就像使用普通的 grep 和管道一样?

cat <folder> | grep 'pattern1' | grep 'pattern2'

【问题讨论】:

  • 您的问题不清楚。您的初始命令查看(tar.gz?)压缩文件中的多个文件,搜索单个模式,但您的伪代码在单个文件中查找多个模式。是哪个?
  • 如果您希望这是文件名,您应该从 \{\} 中删除 \ 。如果您想执行多个grep 命令的管道,您可以将其放入zgrep -H 'pattern1' "$@" | grep 'pattern2' 之类的脚本中并使用-exec script {} \;

标签: linux bash grep cat


【解决方案1】:

你的“伪代码”(cat | grep 'pattern2' | grep 'pattern3')是什么意思?

如果我们有一个文件 file.txt 包含:

pattern this text on the line <br>
pattern2 this text on the line <br>
this pattern3 <br>
pattern2pattern3 this line

然后是你的“伪代码”

cat file.txt | grep 'pattern2' | grep 'pattern3'

将导致:pattern2pattern3 this line。如果这是您想要的,我们可以使用

zcat file.gz | grep 'pattern1' | grep 'pattern2'

但是如果我们看一下find . -name "*.gz" -exec zgrep -H 'PATTERN' \{\} \;,它甚至还没有接近真正的东西,因为那更像是:

   cat /**.*txt | grep 'pattern'

它本身有点特殊,samt结果将由

grep -R 'pattern'

那么我会在 .gz 的情况下说(不确定 /**/*.gz 是否适用于 zcat)

zcat /**/*.gz | grep 'pattern'

【讨论】:

    【解决方案2】:

    您可以通过第二个 grep 管道查找结果:

    find . -name "*.gz" -exec zgrep -H "PATTERN1" {} \; | grep "PATTERN2"

    【讨论】:

      【解决方案3】:

      关于您的具体问题

      How can I make this happen just like using normal grep with pipe: cat | grep 'pattern1' | grep 'pattern2'
      

      您可以使用find 到cat 所有文件,然后使用grep,但这并不好,因为您只会得到没有文件名的结果行。

      最好只使用两个 grep 命令:

      zgrep 'pattern1' *.gz | grep 'pattern2'
      

      如果您想包含子目录,您可以使用 globstar(假设您正在运行 bash):

      shopt -s globstar
      zgrep 'pattern1' **.gz | grep 'pattern2'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-04
        • 1970-01-01
        • 1970-01-01
        • 2015-09-28
        • 1970-01-01
        • 1970-01-01
        • 2012-12-27
        • 2012-06-25
        相关资源
        最近更新 更多