grep - सूची फ़ाइल का नाम जहाँ मिलान पाया जाता है


31

मेरे पास निर्देशिका में .html फ़ाइलों का एक गुच्छा है। मैं प्रत्येक फ़ाइल को देखना चाहता हूं और एक पैटर्न (एमडी 5) से मेल खाता हूं। यह सब काफी आसान है। समस्या मुझे यह जानने की है कि मैच किस फ़ाइल में पाया गया था।

cat *.html | grep 75447A831E943724DD2DE9959E72EE31

केवल HTML पृष्ठ की सामग्री को लौटाता है, जहाँ मैच पाया जाता है, लेकिन यह मुझे वह फ़ाइल नहीं बताती है, जिसमें यह पाया गया था। मुझे मेरा नाम मिला फ़ाइल नाम दिखाने के लिए grep कैसे मिल सकता है?


प्रदान किया गया सुझाव वास्तव में काम नहीं करता है .... सभी मुझे 'मानक इनपुट' बिल्ली * .html | grep -i -H 1ee024007823cc0bfbefba98ba1e1f4c (मानक इनपुट): <html> <head> <title>
BeMy Friend

4
आप बात याद कर रहे हैं। आपको बिल्ली का उपयोग करने की आवश्यकता नहीं है। बिल्ली व्यक्तिगत फ़ाइलों को अलग करने से grep को रोकती है।
मूर

आपको यह स्टैक ओवरफ्लो पोस्ट उपयोगी लग सकता है ।
पाब्लो ए

जवाबों:


32
grep -H 75447A831E943724DD2DE9959E72EE31 *.html

-H, --with-filename
              Print the file name for each match. This is
              the default when there is more than one file
              to search.

3
जैसा कि यह कहा गया है, यह कई फ़ाइलों के लिए डिफ़ॉल्ट है, इसलिए जब तक एक से अधिक html फ़ाइल हो, -Hआवश्यक नहीं है।
मूरू

1
क्षमा करें, मेरा प्रश्न आक्रामक था। मुझे कहना चाहिए कि मैं कुछ समय के लिए इस पर काम कर रहा हूं और मैंने कई स्विच का उपयोग किया है और मैन पेज पढ़ा है जहां कहा गया है कि यह डिफ़ॉल्ट रूप से फ़ाइल नाम को सूचीबद्ध करता है .... लेकिन मुझे जो मिलता है वह है (मानक इनपुट) ) जहां यह फ़ाइल नाम सूचीबद्ध करना चाहिए।
BeMy मित्र

और यह केवल अगर मैं -H स्विच देता हूं। यदि मैं केवल वही करता हूं जो मैंने ओपी में सूचीबद्ध किया है, तो यह कोई फ़ाइल नाम प्रदान नहीं करता है।
BeMy मित्र

3
@BeMyFriend, समस्या यह है catcatका मतलब है यदि आप उन्हें पास करने से पहले सभी फ़ाइलों को टॉगल कर लेते हैं grep, तो grepबस एक बड़ी मानक इनपुट फ़ाइल देखें और (डिविज़न करने में कमी) आपको सिंगल फ़ाइलों के बारे में कोई भी जानकारी वापस नहीं दे सकती। देख?। साइरस, जवाब में यह समझाने के बारे में क्या?
रोमानो

ठीक है, समस्या कैट कमांड है, लेकिन एक समाधान क्या हो सकता है?
जोसेफ क्लिमुक

20

मैं एक स्ट्रिंग में फ़ाइलों को खोजने के लिए हर समय इसका उपयोग करता हूं, एक निर्देशिका में RECURSIVELY (इसका अर्थ है, किसी भी उप उप फ़ोल्डर को ट्रेस करना) grep -Ril "yoursearchtermhere"

  • R पुनरावर्ती खोज करना है (सिमिलिंक के बाद)
  • i इसे असंवेदनशील बनाना है
  • l केवल फाइलों का नाम सूचीबद्ध करना है।

इसलिए आपके प्रश्न का उत्तर देना grep -l '75447A831E943724DD2DE9959E72EE31' *.htmlहोगा, लेकिन आप बस grep -Ril '75447A831E943724DD2DE9959E72EE31'उस स्ट्रिंग, केस असंवेदनशील, किसी भी सबफ़ोल्डर में किसी भी फ़ाइल को देखने के लिए कर सकते हैं


macOS को हमेशा एक फ़ाइल डीईएफ़ की आवश्यकता होती है, यह एक वाइल्डकार्ड हो सकता है। अन्यथा, यह इनपुट से ग्रहण करता है stdin( grep: चेतावनी: स्टड की पुनरावर्ती खोज , जो भी पुनरावर्ती स्टड इनपुट का अर्थ होगा :-)। दूसरे शब्दों में:grep -Ril 'texttofind' *
विले

grep -RiH 'pattern'फ़ाइलों का नाम और मिलान वाली रेखा दिखाता है
Ikrom


2
grep -r -H 75447A831E943724DD2DE9959E72EE31 *.html | awk -F : ' { print $1 } '

के लिए वैकल्पिक

grep -r -l 75447A831E943724DD2DE9959E72EE31 *.html

ऊपर करने से फ़ोल्डर और सबफ़ोल्डर में पुनरावर्ती खोज होगी और फ़ाइल का पथ प्रिंट होगा ...


grep -r -l ही मेरे लिए काम की चीज है।
जोसेफ क्लिमुक

0

साइरस द्वारा पोस्ट किया गया उत्तर बिल्कुल उचित है और द राइट वे टीएम ऐसा करने के लिए grepअगर हमें केवल फाइलों को खोजने की आवश्यकता है । जब फ़ाइल नाम को मिलान किए गए फ़ाइल नाम पर अतिरिक्त पार्सिंग या संचालन की आवश्यकता होती है , तो हम कथन के whileसाथ लूप का उपयोग कर सकते हैं if। यहां एक उदाहरण दिया गया है कि फ़ाइल नाम की सूची सुरक्षित रूप से फ़ाइल नाम के पार्सिंग के लिए बहुत अधिक उपयोग किए जाने वाले find+ whileसंरचना से आती है ।

find -type f -name "*.html" -print0 | while IFS= read -r -d '' filename
do
    if grep -q 'PATTERN' "$filename"
    then
        printf "%s found in %s\n" 'PATTERN' "$filename"
        # Here we can insert another command or function
        # to perform other operations on the filename
    fi
done

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