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

时间:2009-08-10 08:58:58

标签: 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`; do echo $f; zcat $f | grep <pattern>; done;

7 个答案:

答案 0 :(得分:48)

zgrep将查找gzip压缩文件,具有-R递归选项,并且-H显示文件名选项:

zgrep -R --include=*.gz -H "pattern match" .

答案 1 :(得分:20)

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

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

find . -name "*.gz" -exec zgrep ⟨pattern⟩ \{\} \;

而且“ls *.gz”在 for 中没用,你应该在将来使用“* .gz”。

答案 2 :(得分:8)

grep如何不支持-R

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

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

答案 3 :(得分:7)

使用find命令

find . -name "*.gz" -exec zcat "{}" + |grep "test"

或尝试使用zcat的递归选项(-r)

答案 4 :(得分:6)

稍晚一点,有类似的问题并且能够解决使用问题;

zcat -r /some/dir/here | grep "blah"

详见此处;

http://manpages.ubuntu.com/manpages/quantal/man1/gzip.1.html

然而,这并没有显示结果匹配的原始文件,而是显示“(标准输入)”,因为它是从管道进入的。 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

希望这有帮助

答案 5 :(得分:2)

find . -name "*.gz"|xargs zcat | grep "pattern"应该这样做。

答案 6 :(得分:1)

zgrep "string" ./*/*

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

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