सभी उपनिर्देशिकाओं में सभी gzip फ़ाइलों के भीतर एक स्ट्रिंग के लिए 'grep' को यूनिक्स करें


8

मैं .gzसभी निर्देशिकाओं और उपनिर्देशिकाओं में सभी फ़ाइलों के माध्यम से एक स्ट्रिंग के लिए कैसे प्राप्त करूं ?

जवाबों:


13

@Steve Weet लगभग वहीं है। अतिरिक्त तर्क के रूप में / dev / null का उपयोग फ़ाइल नाम को दिखाने के लिए बाध्य करने का एक अच्छा तरीका है (मुझे यह याद होगा, धन्यवाद स्टीव), लेकिन यह अभी भी पाया गया हर फ़ाइल के लिए निष्पादन चलाता है - एक विशाल ओवरहेड।

आप प्रत्येक निष्पादन से अधिकतम प्राप्त करने के लिए कुछ समय के लिए zgrep चलाना चाहते हैं:

find . -iname '*.gz' -print0 | xargs -0 zgrep PATTERN

xargszgrep को अधिक से अधिक args (फ़ाइल नाम) की आपूर्ति करेगा, और इसे बार-बार निष्पादित करेगा जब तक कि उसने findकमांड द्वारा आपूर्ति की गई सभी फ़ाइलों का उपयोग नहीं किया हो । फ़ाइल और निर्देशिका नामों में से किसी में स्थान होने पर विकल्प -print0और -0विकल्पों का उपयोग करने की अनुमति देता है।

Mac OS X पर, आप बिना xargs के समान प्रभाव प्राप्त कर सकते हैं:

find . -iname '*.gz' -exec zgrep PATTERN {} +

+1 यह वाकई अच्छा है। मुझे एहसास नहीं था कि xargs एक से अधिक तर्क से गुजरता है। मेरे * निक्स कमांड लाइन-फू में से अधिकांश 20 साल पुराना है और मुझे नहीं लगता कि 20 साल पहले xargs ने ऐसा किया था।
स्टीव वेट

यह पता चला है कि ओएस / एक्स पर उसी तरह का व्यवहार किया जाता है जैसे कि
एक्सर

1
'वी' को समाप्त करने के संबंध में स्टीव वीट के उत्तर के बारे में मेरी टिप्पणी देखें।
डैनियल एंडरसन

-Hकम से कम GNU grep में मिलान रेखा के साथ फ़ाइल का नाम दिखाने के लिए उपयोग करें ।
डैनियल एंडरसन

1
$ zgrep --help
Usage: /bin/zgrep [OPTION]... [-e] PATTERN [FILE]...
Look for instances of PATTERN in the input FILEs, using their
uncompressed contents if they are compressed.

तो कुछ ऐसा है

find . -iname "*.gz" -exec zgrep PATTERN {} \

-Exec हर फ़ाइल के लिए zgrep की एक नई मिसाल पेश करेगा, जो आपको फ़ाइल नाम को देखने से रोकने से अधिक पुनरावृत्त करती है। zgrep -rएक पेड़ के माध्यम से जाने के लिए उपयोग करना बेहतर होगा या अगर xargs zgrep
आरआर

मैं /bin/zgrep: -r: option not supportedअपने नव स्थापित ubuntu प्रणाली पर मिलता है।
aioobe

आप xargsइसके बजाय उपयोग कर सकते हैं ।
नौफ़ल इब्राहिम

'वी' को समाप्त करने के संबंध में स्टीव वीट के उत्तर के बारे में मेरी टिप्पणी देखें।
डैनियल एंडरसन

1

@ वायो लगभग है। कमांड काम करेगा लेकिन आपको फ़ाइल का नाम नहीं बताएगा

निम्नलिखित को आपको फ़ाइल नाम भी बताना चाहिए:

find . -iname "*.gz" -exec zgrep PATTERN {} /dev/null \;

यह /dev/nullसुनिश्चित करने के अलावा कि zgrep दो फ़ाइल नाम देखता है, तो यह आपको फ़ाइल का नाम दिखाएगा यदि यह एक स्ट्रिंग पाता है

संपादित करें

आगे के शोध से पता चलता है कि मेरी मशीन (ओएस / एक्स) के लिए -execतर्क को खोजने के लिए संभव के रूप में कई फ़ाइलनाम जोड़ देगा (जिस तरह से xargsव्यवहार करता है)।


यह बहुत अच्छा है, मुझे नहीं पता था कि OSX के बारे में -exec- मैं पोर्टेबिलिटी के बारे में हूं इसलिए मैं इसे स्क्रिप्ट में इस्तेमाल नहीं करूंगा, लेकिन कमांड प्रॉम्प्ट के लिए बहुत अच्छा है।

अन्य संस्करणों के लिए, '+' के बजाय '+' का उपयोग करते हुए निष्पादन विवरण को समाप्त करने के लिए OSX जैसा ही होगा, इस थ्रेड में कहानियों द्वारा, डिफ़ॉल्ट रूप से होता है। '-Exec कमांड {} +' के लिए मैनुअल प्रविष्टि देखें। यह सभी संस्करणों का सच नहीं है find, लेकिन अधिकांश आधुनिक (उदाहरण के लिए डेबियन आधारित डिस्ट्रोस)।
डैनियल एंडरसन

-Hफ़ाइल का नाम हमेशा मिलान रेखा के साथ, /dev/nullहैक के बजाय GNU grep में कम से कम दिखाने के लिए उपयोग करें ।
डैनियल एंडरसन

0

निम्नलिखित एक उपचार में काम करता है zsh

for archive in **/*.gz; do
    echo "[${archive}] "
    gzip -dc ${archive} | grep -n "String"
done

यह भी में काम कर सकते हैं bash, ksh, आदि ...

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.