Grep आउटपुट में फ़ाइल नाम और लाइन नंबर दिखाएं


87

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

क्या मेरे लिए ऐसा करने वाला ग्रीप ध्वज है? मैं के संयोजन का उपयोग करने के लिए कोशिश कर रहे हैं -nऔर -lलेकिन इन या तो कोई संख्या के साथ फ़ाइल नाम बाहर प्रिंट कर रहे हैं या बस टर्मिनल जो आसानी से नहीं पढ़ा जा सकता है के लिए पाठ का एक बहुत बाहर डंपिंग।

उदाहरण के लिए:

  grep -ln "search" *

क्या मुझे जागने के लिए इसे पाइप करने की आवश्यकता है?


जवाबों:


137

मुझे लगता -lहै कि यह बहुत अधिक प्रतिबंधक है क्योंकि यह उत्पादन को दबा देता है -n। मैं सुझाव दूंगा -H( --with-filename): प्रत्येक मैच के लिए फ़ाइल नाम प्रिंट करें।

grep -Hn "search" *

यदि वह बहुत अधिक आउटपुट देता है, तो -oकेवल उस भाग को प्रिंट करने का प्रयास करें जो मेल खाता है।

grep -nHo "search" * 

इस जवाब ने मेरे लिए भी काम किया। मुझे पुन: खोज करने की आवश्यकता थी और इस उदाहरण कमांड का उपयोग किया: grep -Hnor "localhost"। यह सूची फ़ाइल के नाम और लाइन नंबर, संक्षिप्त और संक्षिप्त के साथ सभी मेल खाती है।
टॉरस्टेड

यह भी परिणाम प्रदर्शित करता है और न केवल फ़ाइल नाम और लाइन नंबर
elig

30
grep -rin searchstring * | cut -d: -f1-2

यह कहेगा, पुनरावर्ती खोज ( searchstringइस उदाहरण में स्ट्रिंग के लिए), मामले की अनदेखी, और लाइन नंबर प्रदर्शित करें। उस grep से आउटपुट कुछ इस तरह दिखाई देगा:

/path/to/result/file.name:100: Line in file where 'searchstring' is found.

अगला हम पाइप को काटते हैं जो :हमारे क्षेत्र के सीमांकक के रूप में बृहदान्त्र का उपयोग करके कट कमांड का परिणाम देता है और 2 के माध्यम से 1 को प्रदर्शित करता है।

जब मुझे अक्सर उपयोग किए जाने वाले लाइन नंबरों की आवश्यकता नहीं होती है -f1(केवल फ़ाइल नाम और पथ), और फिर आउटपुट को पाइप कर देता है uniq, ताकि मैं केवल प्रत्येक फ़ाइल नाम को एक बार देखूं:

grep -ir searchstring * | cut -d: -f1 | uniq

1
मुझे लगता है कि यह मूल प्रश्न का सबसे अच्छा जवाब देता है। केवल फ़ाइल नाम और लाइन नंबर।
मस्ताबेला

1
ध्यान दें कि यह काम नहीं करता है यदि आपके पास विंडोज़ के पूर्ण पथ नाम जैसे `C: \ Users \ me \ git` है क्योंकि इसमें पहले से ही एक कॉलोन है।
hirse

18

मुझे प्रयोग करना पसंद है:

grep -niro 'searchstring' <path>

लेकिन ऐसा सिर्फ इसलिए है क्योंकि मैं हमेशा अन्य तरीकों को भूल जाता हूं और मैं किसी कारण से रॉबर्ट डे grep -नीरो को नहीं भूल सकता हूं :)


कभी नहीं सोचा था कि मैं ऊपर के लिए upvotes मिलेगा। बस एक मजेदार हिस्सा। धन्यवाद! (लेकिन यह वास्तव में काम करता है - कम से कम मैकओएस पर)
बास वैन ओमेन

इसे याद करने के अपने तरीके से प्यार करें!
ग्रेग हिल्सटन

0

@ToreAurstad की टिप्पणी से मंत्रमुग्ध किया जा सकता है grep -Horn 'search' ./, जिसे याद रखना आसान है।

grep -HEroine 'search' ./ काम भी कर सकता था;)

जिज्ञासु के लिए:

$ grep --help | grep -Ee '-(H|E|r|o|i|n|e),'
  -E, --extended-regexp     PATTERNS are extended regular expressions
  -e, --regexp=PATTERNS     use PATTERNS for matching
  -i, --ignore-case         ignore case distinctions
  -n, --line-number         print line number with output lines
  -H, --with-filename       print file name with output lines
  -o, --only-matching       show only nonempty parts of lines that match
  -r, --recursive           like --directories=recurse

0

यहां बताया गया है कि मैंने एक स्ट्रिंग को खोजने के लिए पेड़ को खोजने के लिए उत्कीर्ण उत्तर का उपयोग किया जिसमें स्ट्रिंग युक्त फाइलें थीं:

find . -name "*.f" -exec grep -nHo the_string {} \;

NHo के बिना, आप केवल यह सीखते हैं कि कुछ फ़ाइल, कहीं, स्ट्रिंग से मेल खाती है।

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