2009-08-10 35 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"應該做的。

相關問題