सवाल उपनिर्देशिका सहित पाठ खोजने के लिए "grep" कमांड का उपयोग कैसे करें


मैं उन सभी फ़ाइलों को ढूंढना चाहता हूं जिनमें टेक्स्ट की एक विशिष्ट स्ट्रिंग है। grep आदेश काम करता है, लेकिन मुझे नहीं पता कि प्रत्येक निर्देशिका के लिए इसका उपयोग कैसे करें (मैं केवल अपनी वर्तमान निर्देशिका के लिए ही कर सकता हूं)। मैंने पढ़ने की कोशिश की man grep, लेकिन इससे कोई मदद नहीं मिली।


293
2017-08-01 11:38


मूल


grep -RIn <yor pattern> * सभी पाठ फ़ाइलों में मौजूदा निर्देशिकाओं से नीचे खोज करेगा। सुनिश्चित नहीं है कि फ़ाइल पैटर्न जैसे * सी। केवल grep के साथ मेरी खोज को दोबारा कैसे करें
वाइल्डकार्ड के साथ --include="*.C" विकल्प, @ user311346, @Lekensteyn के लिए धन्यवाद। - Bob Stein
वर्तमान और सभी उप निर्देशिकाओं में एक स्ट्रिंग के लिए फ़ाइलों को रिकर्सिवली खोजने के लिए खोज और grep संयोजन का उपयोग करें। इसे देखो wilddiary.com/find-files-containing-my-text - Drona


जवाब:


इसका उपयोग करना बेहतर होगा

grep -rl "string" /path

कहा पे

  • -r (या --recursive) विकल्प का उपयोग सभी उप-निर्देशिकाओं को पार करने के लिए भी किया जाता है /path, जहाँ तक
  • -l (या --files-with-matches) विकल्प का उपयोग केवल मेल खाने वाली फाइलों के फाइलनामों को मुद्रित करने के लिए किया जाता है, न कि मिलान रेखाएं (यह गति को भी सुधार सकती है, इसके बाद grep इस विकल्प के साथ पहले मैच में एक फ़ाइल पढ़ने बंद करो)।

376
2017-08-01 11:55



दरअसल यदि "स्ट्रिंग" खोजने के लिए एक टेक्स्ट पैटर्न है, तो उस कार्यक्षमता का उपयोग करना बेहतर होता है, अन्यथा किसी को समस्या का सामना करना पड़ सकता है जब स्ट्रिंग में डॉट या विशेष वर्ण होता है जिसका नियमित अभिव्यक्तियों में अर्थ होता है और केवल एक बिंदु नहीं जो स्ट्रिंग के रूप में पाया जाना चाहिए , जैसा है। तब मैं उपयोग करूंगा -rlF स्विच, -F "निश्चित स्ट्रिंग" के लिए (और regexp नहीं - उदाहरण के लिए)। बेशक, अगर कार्य regexps का उपयोग कर रहा था, तो मुझे क्षमा करें। निश्चित रूप से, बिना सिद्धांत के, वही सिद्धांत, मैं अक्सर देखता हूं कि लोग grep खोजों को "पाठ" मानते हैं और इससे समस्याएं पैदा हो सकती हैं जो विशेष रूप से एक regexp के रूप में कुछ मतलब है। - LGB
वहाँ भी है -i झंडा जो मामले को अनदेखा करता है। - Marco Ceppi♦
मैं केवल दिखाने के लिए होगा --recursive विकल्प, विकल्पों और उपयोग परिदृश्यों में से कई टन हैं जिनके बारे में बात कर सकते हैं। मैंने @dmityugov स्वीकार किए गए उत्तर से शुरू किया और बिना काम के संशोधित किया find। - enzotib
@ एनएन .: किया गया :-) - enzotib
@ScottBiggs: विकल्प के साथ --include '*.h' - enzotib


यदि आप फ़ाइलों में मेल खाने वाली लाइनों की तलाश में हैं, तो मेरा पसंदीदा आदेश है:

grep -Hrn 'search term' path/to/files
  • -H फ़ाइल नाम मुद्रित करने का कारण बनता है (जब कई फाइलें खोजी जाती हैं तो निहित)
  • -r एक पुनरावर्ती खोज करता है
  • -n लाइन नंबर मुद्रित करने का कारण बनता है

path/to/files हो सकता है . वर्तमान निर्देशिका में खोजने के लिए

और विकल्प जो मुझे बहुत उपयोगी लगता है:

  • -I बाइनरी फाइलों को अनदेखा करें (पूरक: -a पाठ के रूप में सभी फाइलों का इलाज करें)
  • -F इलाज search term एक शाब्दिक के रूप में, नियमित अभिव्यक्ति नहीं
  • -i केस-असंवेदनशील खोज करें
  • --color=always पाइपिंग के दौरान भी रंगों को मजबूर करने के लिए less। बनाना less समर्थन रंग, आप का उपयोग करने की जरूरत है -r विकल्प:

    grep -Hrn search . | less -r
    
  • --exclude-dir=dir निर्देशिकाओं को छोड़कर उपयोगी है .svn तथा .git

Example output


138
2017-08-01 12:27



-H एक फ़ोल्डर पर अनावश्यक है, यदि एक फ़ाइल है, तो एक फ़ाइल है, जैसा कि संभव है। वास्तव में, आदमी पृष्ठ कहता है -H, --with-filename: Print the file name for each match. This is the default when there is more than one file to search. - enzotib
मुझे यह नहीं पता था, यह हमेशा की तरह काम करता था। फ़ाइलों की तलाश करते समय यह मेरा डिफ़ॉल्ट आदेश है। - Lekensteyn
क्या केवल फाइलों पर विचार करने का कोई तरीका है, कहें, एक विस्तार (और इसे-साथ गठबंधन करने के लिए)? - user2413
@ user2413 कोशिश करें --include '*.*' - Lekensteyn
@enzotib बस एक FYI: मुझे हर फ़ाइल में हर पंक्ति का अच्छा साफ आउटपुट नहीं मिलता है जहां मेरा टेक्स्ट -rln nor -rl के साथ दिखाई देता है, लेकिन मैं -Hrn के साथ करता हूं। अनावश्यक या नहीं, यह -Hrn विकल्पों के साथ ऊपर स्क्रीनशॉट की तरह दिखता है। इसके अलावा, ऐसा लगता है कि बिना काम करता है -एच। - SgtPooki


मेरा मानना ​​है कि आप इस तरह कुछ उपयोग कर सकते हैं:

find /path -type f -exec grep -l "string" {} \;

टिप्पणियों से स्पष्टीकरण

find एक आदेश है जो आपको किसी दिए गए पथ की उप-निर्देशिकाओं में निर्देशिकाओं और लिंक जैसे फ़ाइलों और अन्य वस्तुओं को खोजने देता है। यदि आप एक मुखौटा निर्दिष्ट नहीं करते हैं कि फाइलनामों को पूरा करना चाहिए, तो यह सभी निर्देशिका वस्तुओं को समझाता है।

  • -type f निर्दिष्ट करता है कि इसे केवल फाइलों को संसाधित करना चाहिए, न कि निर्देशिका आदि।
  • -exec grep निर्दिष्ट करता है कि प्रत्येक मिली फ़ाइल के लिए, इसे grep कमांड चलाया जाना चाहिए, इसके फ़ाइल नाम को इसके प्रति तर्क के रूप में पास करना चाहिए {} फ़ाइल नाम के साथ

21
2017-08-01 11:48



बस उन लोगों के लिए जो नहीं जानते हैं, जोड़ रहे हैं -name '*.py' मैचों को '.py' में समाप्त होने वाली फ़ाइलों पर प्रतिबंधित करता है। - Daniel F
मुझे यह पसंद है कि इसमें उन क्लाइंट शामिल हैं जिनके पास -आर उनके grep कमांड में लागू नहीं है। - Aviose


मेरा डिफ़ॉल्ट आदेश है

grep -Rin string *

मैं एक कैपिटल 'आर' का उपयोग करता हूं क्योंकि ls रिकर्सिव के लिए इसका इस्तेमाल करता है। चूंकि grep दोनों को स्वीकार करता है, इसका उपयोग करने का कोई कारण नहीं है।

संपादित करें: स्पष्ट रूप से प्रति एचवीएनएसवीटिंग -R सिमलिंक का पालन करेंगे जहां के रूप में -r नहीं होगा।


17
2017-08-01 14:43



छिपी हुई फाइलों में भी खोजने के लिए, चलाएं shopt -s dotglob (याद है -s "सेट" के रूप में)। तब फाइलों को हटाते समय सावधान रहें। यदि आपके पास dotglob सक्षम है, rm -r * वर्तमान डीआईआर में सबकुछ हटा देता है, लेकिन भी इसके ऊपर निर्देशिका क्योंकि .. मैचों। Dotglob को अक्षम करने के लिए, उपयोग करें shopt -u dotglob ( "सेट नहीं")। परिवर्तन अस्थायी हैं हालांकि, यह केवल वर्तमान खोल पर लागू होता है। - Lekensteyn
मैं इसके बारे में भूल गया। क्या इसे एक लाइन के लिए सेट करने का कोई तरीका है? कुछ इस तरह shopt -s dotglob & <grep cmd> & shopt -y dotglob केवल अधिक सुविधाजनक? इस तरह हमें इसे रीसेट करने की चिंता करने की आवश्यकता नहीं होगी - user606723
इसके अलावा, यह उपयोग करना शायद आसान है grep -Rin string . इनमें से ज्यादातर मामलों में। मैं बस * का उपयोग करता हूं क्योंकि ऐसा लगता है कि यह स्वाभाविक रूप से अधिक है। - user606723
यदि आप रिकर्सिव grep करते हैं, तो आप बस "।" से शुरू कर सकते हैं। के बजाय "*"। कोई डॉटग्लोब की आवश्यकता नहीं है। - Michał Šrajer
इसे वोट दें, मैनपेज में एक बात का उल्लेख नहीं है R प्रतीकात्मक लिंक का पालन करेंगे, r नहीं करता - HVNSweeting


यदि आप कुछ नया करने की कोशिश कर रहे हैं, तो दे दो ack एक दृश्य। इसके लिए वर्तमान निर्देशिका की खोज करने के लिए आदेश string है:

ack string

स्थापना काफी सरल है:

curl http://betterthangrep.com/ack-standalone > ~/bin/ack && chmod 0755 !#:3

(बशर्ते आपको पहले ही निर्देशिका मिल गई हो ~/bin और यह आपके में अधिमानतः है PATH।)


11
2017-08-01 15:09



या बस एपीटी-grep इंस्टॉल करें (, और अपने .bashrc में उपनाम ack = ack-grep जोड़ें) - markijbema
अंतिम पैरामीटर क्या करते हैं chmod आदेश करो? क्या वे विशिष्ट हैं chmod या वे संबंधित बाश हैं (द !#:3 अंश)? - Elliott Darfink
@ElliottDarfink वह बैश का उपयोग कर रहा है इतिहास सुविधा - ! है एक घटना डिजाइनर। वे पुनरावृत्ति से बचने के लिए बहुत शक्तिशाली हैं। !#:3 अब तक कमांड लाइन के तीसरे टोकन का संदर्भ देता है, यानी। ~/bin/ack इस मामले में। - Konrad Rudolph


आदेश rgrep ऐसी जरूरत के लिए समर्पित है

यदि उपलब्ध नहीं है, तो आप इसे इस तरह प्राप्त कर सकते हैं

mkdir -p ~/bin
cd ~/bin
wget http://sdjf.esmartdesign.com/files/rgrep
chmod +x rgrep

ऊपर वर्णित अनुसार आप सीधे अपने डिफ़ॉल्ट grep विकल्पों में सेट कर सकते हैं।

मैं व्यक्तिगत रूप से उपयोग करते हैं

[[  ${#args} -lt 5 && "${args//[[:space:]]/}" == "-i" ]] && args="-Hin"
args="${args:--Hns} --color=auto"

संबंधित विषय: हमेशा रंग के साथ rgrep का उपयोग कैसे करें


3
2018-01-02 13:58



rgrep grep संकुल द्वारा प्रदान किया जाता है जो डिफ़ॉल्ट रूप से उबंटू में स्थापित होता है। - karel


अद्यतन 2:

आदेशों की इस पंक्ति का उपयोग कर find तथा grep समस्या को हल करता है:

$ find path_to_search_in -type f -exec grep -in searchString {} 2> /dev/null +

--color=<always or auto> रंगीन आउटपुट के लिए:

$ find path_to_search_in -type f \
            -exec grep --color=always -in searchString {} 2>/dev/null +

उदाहरण:

$ find /tmp/test/ -type f -exec grep --color=auto -in "Search string" {} 2>/dev/null +

नीचे दिए गए स्नैपशॉट में एक उदाहरण चलाया गया है: snap1


अद्यतन 1:

आप कोड का पालन करने का प्रयास कर सकते हैं; आपके में एक समारोह के रूप में .bashrcया .bash_aliases या एक लिपि में:

wherein () 
{ 
    for i in $(find "$1" -type f 2> /dev/null);
    do
        if grep --color=auto -i "$2" "$i" 2> /dev/null; then
            echo -e "\033[0;32mFound in: $i \033[0m\n";
        fi;
    done
}

उपयोग: wherein /path/to/search/in/ searchkeyword

उदाहरण:

$ wherein ~/Documents/ "hello world"

(नोट: जैसा कि @enzotib द्वारा नीचे दी गई टिप्पणियों में सुझाया गया है, यह फ़ाइल / निर्देशिकाओं के साथ उनके नामों में रिक्त स्थान सहित काम नहीं करता है।)


मूल पोस्ट

खोज स्ट्रिंग के साथ केवल उस पंक्ति को स्ट्रिंग और आउटपुट की खोज करने के लिए:

$ for i in $(find /path/of/target/directory -type f); do \
    grep -i "the string to look for" "$i"; done

उदा .:

$ for i in $(find /usr/share/applications -type f); \
    do grep -i "web browser" "$i"; done

खोज स्ट्रिंग युक्त फ़ाइल नाम प्रदर्शित करने के लिए:

$ for i in $(find /path/of/target/directory -type f); do \
    if grep -i "the string to look for" "$i" > /dev/null; then echo "$i"; fi; done;

उदा .:

$ for i in $(find /usr/share/applications -type f); \
    do if grep -i "web browser" "$i" > /dev/null; then echo "$i"; \
    fi; done;

2
2018-01-25 11:11



रिक्त स्थान वाले फ़ाइल नामों पर विफल रहता है। असफलता इस तथ्य से छिपी हुई है कि stderr दिखाया नहीं गया है। - enzotib
@enzotib यह इंगित करने के लिए धन्यवाद .. यह अभी भी निर्दिष्ट समारोह के लिए अनसुलझा है .. हालांकि मैंने एक और लाइनर जोड़ा है .. - precise
अब जवाब @dmityugov के समान है। - enzotib
हां, लेकिन उस अर्थ में यदि आप चेक करते हैं तो इस पृष्ठ में अधिकांश जवाब समान हैं जो वे उपयोग करते हैं grep, इसके बाद सबसेट का उपयोग कर रहे हैं find साथ में grep... लेकिन यदि आप अलग-अलग स्विच और ट्वीव को एक अलग उत्तर के रूप में स्वीकार करना चाहते हैं, तो शायद मेरा यहां भी फिट होगा .. या आप अलग हैं? आखिरी अपडेट वह करता है जो मैं अपनी खोज में चाहता हूं: खोज कुंजी और लाइन संख्या वाले लाइनों के साथ फ़ाइल नाम। भी :) और बेहतर पठनीयता के लिए रंगीन आउटपुट और त्रुटि फ़िल्टर .. - precise


मैं xargs का उपयोग करके ऐसा करता हूं, एक बहुत ही कमांड कमांड

find ./ -type f -print0 | xargs -0 grep 'string_you_are_looking_for'

ढूंढें ./ आपको वर्तमान फ़ोल्डर में सभी फ़ाइलों की एक रिकर्सिव सूची देता है तो आप इसे xargs पर पाइप करते हैं जो उन फ़ाइलों में से प्रत्येक पर grep कमांड निष्पादित करता है


1
2017-08-01 15:30



का उपयोग करते हुए xargs के बग़ैर -print0 विकल्प find तथा -0 विकल्प xargs बहिष्कृत है, यह रिक्त स्थान वाले फ़ाइल नामों में विफल हो जाएगा। - enzotib
@enzotib मैंने आपके द्वारा सुझाए गए उत्तर को संपादित किया है.- कृपया समीक्षा करें और यदि संपादन और सुधार करने की आवश्यकता है, तो मैं आपके द्वारा फिर से संपादन करने में प्रसन्न हूं। धन्यवाद - αғsнιη
@ कासिया: अब ठीक है, मेरे डाउनवोट को हटा दिया। - enzotib


मुझे पता है कि यहां बहुत सारे जवाब हैं, लेकिन यदि आप फ़ाइलों को खोजते समय अन्य प्रतिबंध जोड़ना चाहते हैं तो यहां एक विकल्प है:

find . -type f -exec grep --quiet string_to_look_for {} ';' -print

यह इसलिए काम करता है grep यदि परिणाम मिला, तो 0 वापस आ जाएगा, अन्यथा। उदाहरण के लिए आप फ़ाइलों को 1 एमबी बड़ा पा सकते हैं तथा कुछ शामिल है:

find . -type f -exec grep --quiet string_to_look_for {} ';' -size 1M -print

कई आवश्यकताओं के लिए आप शायद अनुकूलक ध्वज का उपयोग करना चाहते हैं -O जो जीएनयू grep में मौजूद है।


0
2018-03-11 13:56





सी, सीपीपी कोड में खोजने के लिए एक स्क्रिप्ट (खोज-इन-कोड):

#!/bin/sh

find . \( -iname "*.c" -o -iname "*.cpp" -o -iname "*.h" \) -type f -print0 | xargs -0 grep --color -n "$1"

उपयोग:

find-in-code "search string"

0
2018-06-11 16:49