2009-08-10 8 views
40

मेरी वर्तमान समस्या यह है कि मेरे पास लगभग 10 फ़ोल्डर्स हैं, जिनमें gzipped फ़ाइलें हैं (लगभग 5 प्रत्येक के आसपास)। यह 50 फाइलें खोलने और देखने के लिए बनाता है।फ़ोल्डर में एक gzipped फ़ाइल के अंदर स्ट्रिंग ढूंढें

क्या यह पता लगाने के लिए एक आसान तरीका है कि फ़ोल्डर के अंदर एक gzipped फ़ाइल एक विशेष पैटर्न है या नहीं?

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 Gzipped फाइलों में दिखाई देगा, एक आर पुनरावर्ती का विकल्प है, और एक एच मुझे फ़ाइल नाम विकल्प दिखाने:

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

FWIW में कौन सा फ़ाइल मिला, मेरा zgrep समर्थन नहीं करता -R – ZombieDev

+0

@Ned Batchelder, दिशा देने के लिए धन्यवाद। लेकिन मेरे लिए zgrep विकल्प "पैटर्न" फ़ाइलों का पालन करने के बाद – hiren

+0

'zgrep -R --include = \ *। Gz-h" पैटर्न "zsh – blacktooth

7

खोजने आदेश

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

का उपयोग करें या zcat

+0

-bash-3.00 $ ढूंढें। -नाम "* .gz" -exec zcat "{}" + | grep "ठीक नहीं है" ढूंढें: '-exec ' पर अनुपलब्ध तर्क निष्पादन के बाद कुछ याद आ रहा है? – gagneet

+0

यह मेरे लिए काम करता है। – ghostdog74

+0

शायद खोजने के लिए बदलने की कोशिश करें ... +; | grep ... और – ghostdog74

18

की पुनरावर्ती विकल्प (-r) का उपयोग करके देखें आप zcat यहाँ की जरूरत नहीं है क्योंकि वहाँ zgrep और zegrep।

आप एक निर्देशिका पदानुक्रम में एक आदेश चलाना चाहते हैं, तो आप का उपयोग खोज:

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

और यह भी "ls *.gz" बेकार के लिए में है और आप बस का उपयोग करना चाहिए "* .gz " भविष्य में।

+0

मुझे ऐसी रेखाएं मिलती हैं जिनमें इस पैटर्न को शामिल किया गया है, लेकिन इस विधि से फ़ाइल का नाम नहीं है। क्या यह सूचीबद्ध करने का कोई तरीका है? – gagneet

+2

'ढूंढें। -नाम '* .gz' -print0 | xargs -0 zgrep पैटर्न'? – Hasturkun

+2

पुरानी grep चाल: ढूंढें। -नाम "* .gz" -exec zgrep ⟨pattern⟩/dev/null \ {\} \; # इससे grep को लगता है कि एक से अधिक फाइलें हैं और फ़ाइल नाम प्रिंट करें। –

6

कैसे zgrep का समर्थन नहीं करते आर

मुझे लगता है कि "Nietzche-jou" के समाधान के लिए एक बेहतर जवाब हो सकता है, लेकिन मैं इस

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

फ़ाइल का नाम दिखाने के लिए आदेश के लिए धन्यवाद :) –

6

की तरह फ़ाइल नाम कुछ इस पर देर से एक सा में आ रहा है दिखाने के लिए विकल्प एच जोड़ना होगा, एक ऐसी ही समस्या थी और था करने में सक्षम उपयोग करने के लिए esolve;

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 का उपयोग करते समय भी फ़ाइलों की एक छोटी मात्रा के साथ काम की तुलना में काफी धीमी है। मैं फ़ाइल नाम को ज़ेडैट आउटपुट बनाने में भी असमर्थ था (-v का उपयोग करके फ़ाइल नाम को स्पष्ट रूप से आउटपुट करेगा, लेकिन प्रत्येक पंक्ति पर नहीं)। ऐसा प्रतीत होता है कि वर्तमान में कोई उपकरण नहीं है जो grep (यानी -H विकल्प) के साथ गति और नाम स्थिरता दोनों प्रदान करेगा।

यदि आपको उस फ़ाइल के नाम की पहचान करने की आवश्यकता है जो परिणाम संबंधित है, तो आपको या तो अपना स्वयं का टूल लिखना होगा (पाइथन कोड की 50 लाइनों में किया जा सकता है) या धीमी विधि का उपयोग करें। यदि आपको नाम की पहचान करने की आवश्यकता नहीं है, तो zcat -r का उपयोग करें।

आशा इस

2

find . -name "*.gz"|xargs zcat | grep "pattern" करना चाहिए मदद करता है।

संबंधित मुद्दे