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

gag*_*eet 44 linux directory shell grep gzip

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

是否有更简单的方法来查明文件夹中的gzip压缩文件是否具有特定模式?

zcat ABC/myzippedfile1.txt.gz | grep "pattern match"
zcat ABC/myzippedfile2.txt.gz | grep "pattern match"
Run Code Online (Sandbox Code Playgroud)

对于所有文件夹和子文件夹,我可以在一行中执行相同操作,而不是编写脚本吗?

for f in `ls *.gz`; do echo $f; zcat $f | grep <pattern>; done;
Run Code Online (Sandbox Code Playgroud)

Ned*_*der 50

zgrep将查找gzip文件,有一个-R递归选项,-H显示文件名选项:

zgrep -R --include=*.gz -H "pattern match" .
Run Code Online (Sandbox Code Playgroud)

  • FWIW,我的zgrep不支持-R (16认同)
  • `zgrep(gzip)1.4` - 最新的Ubuntu 12.04 LTS没有`-R`不包含. (5认同)
  • 同样在Ubuntu 14.04上LTS:" - R:选项不受支持" (3认同)

Nie*_*jou 20

你不需要zcat,因为有zgrepzegrep.

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

find . -name "*.gz" -exec zgrep ?pattern? \{\} \;
Run Code Online (Sandbox Code Playgroud)

而且还" ls *.gz"是没用,你应该只使用"*.广州"的未来.

  • `找到.-name'*.gz'-print0 | xargs -0 zgrep pattern`? (2认同)
  • 老grep技巧:找到.-name"*.gz"-execzgrep⟨pattern⟩/ dev/null\{\} \; #这将使grep认为有多个文件并打印文件名. (2认同)

Fra*_*vin 8

zgrep如何不支持-R

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

find . -name "*.gz" -exec zgrep -H 'PATTERN' \{\} \;
Run Code Online (Sandbox Code Playgroud)


gho*_*g74 7

使用find命令

find . -name "*.gz" -exec zcat "{}" + |grep "test"
Run Code Online (Sandbox Code Playgroud)

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


sle*_*cal 6

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

zcat -r /some/dir/here | grep "blah"
Run Code Online (Sandbox Code Playgroud)

详情如下;

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
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,使用该find|zcat方法比zcat -r处理即使是少量文件时要慢得多.我也无法使zcat输出文件名(使用-v显然会输出文件名,但不会在每一行输出).看来目前还没有一种工具可以提供速度和名称与grep的一致性(即-H选项).

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

希望这可以帮助