find文件夹中gzip文件中的string
我目前的问题是,我有大约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;
zgrep会查看gzip文件,有-Rrecursion选项,而-H显示文件名选项:
zgrep -R --include=*.gz -H "pattern match" .
你不需要zcat ,因为有zgrep和zegrep。
如果你想在一个目录层次上运行一个命令,你可以使用find:
find . -name "*.gz" -exec zgrep ⟨pattern⟩ \{\} \;
而且“ ls *.gz
”也没用,你今后应该只用“* .gz”。
使用find命令
find . -name "*.gz" -exec zcat "{}" + |grep "test"
或者尝试使用zcat的recursion选项(-r)
zgrep如何不支持-R
我认为“Nietzche-jou”的解决scheme可能是更好的答案,但我会添加选项-H来显示文件名
find . -name "*.gz" -exec zgrep -H 'PATTERN' \{\} \;
有点迟了,有类似的问题,并能够解决使用;
zcat -r /some/dir/here | grep "blah"
如这里所详述的;
http://manpages.ubuntu.com/manpages/quantal/man1/gzip.1.html
但是,这并不显示结果匹配的原始文件,而是显示“(标准input)”,因为它是从pipe道input的。 zcat似乎也不支持输出名称。
在performance方面,这是我们得到的;
$ 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
正如你所看到的,在处理less量文件时,使用find|zcat
方法比使用zcat -r
要慢得多。 我也无法让zcat输出文件名(使用-v
显然会输出文件名,但不是每一行)。 看起来,目前还没有一种工具可以提供速度和名称与grep的一致性(即-H
选项)。
如果您需要识别结果所属文件的名称,那么您需要编写自己的工具(可以在50行Python代码中完成)或使用较慢的方法。 如果您不需要识别名称,则使用zcat -r
。
希望这可以帮助
find . -name "*.gz"|xargs zcat | grep "pattern"
find . -name "*.gz"|xargs zcat | grep "pattern"
应该做的。