Linux 在文件夹中的gzip文件中查找字符串

Linux 在文件夹中的gzip文件中查找字符串,linux,shell,directory,grep,gzip,Linux,Shell,Directory,Grep,Gzip,我目前的问题是,我有大约10个文件夹,其中包含gzip文件(平均每个大约5个)。这使得它有50个文件可以打开和查看 有没有更简单的方法来确定文件夹中的gzip文件是否具有特定模式 zcat ABC/myzippedfile1.txt.gz | grep "pattern match" zcat ABC/myzippedfile2.txt.gz | grep "pattern match" 我可以在一行中为所有文件夹和子文件夹编写脚本,而不是编写脚本吗 for f in `ls *.gz`; d

我目前的问题是,我有大约10个文件夹,其中包含gzip文件(平均每个大约5个)。这使得它有50个文件可以打开和查看

有没有更简单的方法来确定文件夹中的gzip文件是否具有特定模式

zcat ABC/myzippedfile1.txt.gz | grep "pattern match"
zcat ABC/myzippedfile2.txt.gz | grep "pattern match"
我可以在一行中为所有文件夹和子文件夹编写脚本,而不是编写脚本吗

for f in `ls *.gz`; do echo $f; zcat $f | grep <pattern>; done;
'ls*.gz'中f的
;不要重复$f;zcat$f | grep;完成;
使用find命令

find . -name "*.gz" -exec zcat "{}" + |grep "test"
或者尝试使用zcat的递归选项(-r)

这里不需要zcat,因为这里有zgrep和zegrep

如果要在目录层次结构上运行命令,请使用“查找”:


而且“
ls*.gz
”在中对没有用处,您以后应该只使用“*.gz”。

zgrep将在gzip文件中查找,具有a-R递归选项,a-H显示文件名选项:

zgrep -R --include=*.gz -H "pattern match" .
操作系统特定的命令,因为并非所有参数都适用于所有系统:

Mac10.5+:
zgrep-R--include=\*.gz-H“模式匹配”。


Ubuntu 16+:
zgrep-i-H“模式匹配”*.gz
zgrep如何不支持-R

我认为“Nietzche-jou”的解决方案可能是一个更好的答案,但我会添加选项-H来显示类似这样的文件名

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

在这个问题上来得有点晚,有一个类似的问题,并能够解决使用

zcat -r /some/dir/here | grep "blah"
如本文所述

但是,这不会显示结果匹配的原始文件,而是显示从管道输入的“(标准输入)”。zcat似乎也不支持输出名称

就表现而言,这就是我们得到的

$ alias dropcache="sync && echo 3 > /proc/sys/vm/drop_caches"

$ find 09/01 | wc -l
4208

$ du -chs 09/01
24M

$ dropcache; time zcat -r 09/01 > /dev/null
real    0m3.561s

$ dropcache; time find 09/01 -iname '*.txt.gz' -exec zcat '{}' \; > /dev/null
0m38.041s
如您所见,使用
find | zcat
方法处理即使是少量文件也要比使用
zcat-r
方法慢得多。我也无法让zcat输出文件名(使用
-v
显然会输出文件名,但不是在每一行上)。目前似乎还没有一个工具能够提供与grep的速度和名称一致性(即
-H
选项)

如果需要识别结果所属文件的名称,则需要编写自己的工具(可以在50行Python代码中完成),或者使用较慢的方法。如果不需要识别名称,请使用
zcat-r

希望这有助于查找-名称“*.gz”| xargs zcat | grep“pattern”应该这样做。

zgrep“string”。/*/*

您可以使用上述命令在
dir
目录的.gz文件中搜索
string
,其中
dir
具有以下子目录结构:

/dir
    /childDir1
              /file1.gz
              /file2.gz
    /childDir2
              /file3.gz
              /file4.gz
    /childDir3
              /file5.gz
              /file6.gz

我通过这个方法得到包含这个模式的行,但不是文件名。有什么方法可以把它也列出来吗?
find-名称'*.gz'-print0 | xargs-0 zgrep模式
?旧的grep技巧:查找-名称“*.gz”-执行zgrep⟨图案⟩ /dev/null\{\}\#这将使grep认为不止一个文件,并打印文件名。这并没有告诉我它在-bash-3.00$find中找到了哪个文件-名称“*.gz”-exec zcat“{}”+| grep“NOT OK”find:缺少到“-exec”的参数exec之后似乎缺少了某些内容?可能尝试更改以查找…+;|格雷普。。。请参见,您必须使用“;”find-exec cmd{}+”终止“-exec”选项,因为它相对较新,因此如果您有较旧的find,它可能不支持“+”。它类似于“find-print0 | xargs-0 cmd”只是想知道我们如何得到匹配字符串的文件名。上面的命令只给出了带有match string.FWIW的行,我的zgrep不支持-R@NedBatchelder,谢谢你的指导。但是对于我来说,在zsh
zgrep(gzip)1.4
——最新的Ubuntu12.04 LTS上没有
-R
未包含的zgrep选项“pattern”文件
zgrep-R--include=\*.gz-H“pattern”
。在Ubuntu14.04 LTS上也是如此:“-R:option不受支持”是的,这也是实际显示文件名的命令
/dir
    /childDir1
              /file1.gz
              /file2.gz
    /childDir2
              /file3.gz
              /file4.gz
    /childDir3
              /file5.gz
              /file6.gz