2009-08-10 109 views
40

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

是否有一个更简单的方法来确定一个文件夹中的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; 

回答

47

zgrep将查找gzip文件,有一个-R递归选项和-H告诉我filename选项:

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

FWIW,我的zgrep不支持-R – ZombieDev 2012-08-28 13:42:39

+0

@Ned Batchelder,谢谢你给的方向。但对于我以下工作的zgrep选项“模式”文件 – hiren 2013-03-06 14:42:01

+0

'zgrep -R --include = \ *。gz -H“模式”'zsh – blacktooth 2013-10-28 07:05:11

7

使用find命令

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

,或者尝试使用ZCAT

+0

-bash-3.00 $ find。 -name“* .gz”-exec zcat“{}”+ | grep“NOT OK” 找到:缺少参数到'-exec' 某些东西好像在exec后会丢失? – gagneet 2009-08-10 09:16:36

+0

它适合我。 – ghostdog74 2009-08-10 09:40:57

+0

也许尝试改变发现... +; | grep ...并参见 – ghostdog74 2009-08-10 09:44:20

18

的递归选项(-r)你不需要ZCAT这里,因为有zgrepzegrep。

如果你想运行在一个目录层次的命令,你用发现:

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

,也有“ls *.gz”在是无用的,你应该使用“*。广州“ 在将来。

+0

我得到了包含这个模式的行,但没有使用这个方法得到的文件的名字。有没有什么方法可以让上市? – gagneet 2009-08-10 09:15:06

+2

'发现。 -name'* .gz'-print0 | xargs -0 zgrep pattern'? – Hasturkun 2009-08-10 09:24:49

+2

老grep绝招:找。 -name“* .gz”-exec zgrep⟨pattern⟩/ dev/null \ {\} \; #这将使grep认为有多个文件并打印文件名。 – 2009-08-10 11:08:18

6

如何zgrep不支持-R

我觉得“尼采-柔”的解决方案可能是一个更好的答案,但我想补充-H选项来显示文件名是这样的

​​
+0

感谢命令显示文件的名称:) – 2016-06-24 18:55:20

6

即将在晚了一点在这个,也有类似的问题,是能够r使用;

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

希望这有助于

2

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

相关问题