फ़ाइल फ़ाइल नाम और लाइन नंबर दोनों कैसे लौटाएँ ... -exec grep?


45

उपयोग करते समय find, स्ट्रिंग की खोज करते समय मैं फ़ाइल का नाम और लाइन नंबर कैसे वापस करूँ? मैं एक कमांड में फ़ाइल नाम और दूसरे के साथ लाइन नंबरों को वापस करने का प्रबंधन करता हूं, लेकिन मैं उन्हें संयोजित नहीं कर सकता।

फ़ाइल नाम: find . -type f -exec grep -l 'string to search' {} \;

पंक्ति संख्याएँ: find . -type f -exec grep -n 'string to search' {} \;

जवाबों:


51

कमांड लाइन स्विच फाइल नाम को प्रिंट करने के लिए -Hमजबूर grepकरता है, यहां तक ​​कि सिर्फ एक फाइल के साथ।

% grep -n 7 test.in
7:7
% grep -Hn 7 test.in
test.in:7:7

   -H, --with-filename
          Print the filename for each match.

ध्यान दें कि जैसा कि कोजिरो एक टिप्पणी में कहते हैं , यह पोसिक्स मानक का हिस्सा नहीं है; यह जीएनयू और बीएसडी दोनों प्रकार के जीआरईपी में है, लेकिन यह संभव है कि कुछ प्रणालियों में यह न हो (जैसे सोलारिस)।


4
इस उत्तर को इंगित किया जा सकता है कि -Hध्वज grepएक गैरमानक GNU विस्तार है और गैर-GNH प्रणालियों के लिए वैकल्पिक दृष्टिकोण प्रस्तुत करता है।
कोजिरो

22
find . -type f -exec grep -n 'string to search' /dev/null {} +

(या GNU grep के साथ, -Hविकल्प देखें )


दोनों + और -H महान काम करते हैं, धन्यवाद!
डैनी_जोरिस

और इस उत्तर से संबंधित: unix.stackexchange.com/questions/3682/…
Danny_Joris

4
+1 सही, क्योंकि grepकई फ़ाइल नाम होने के कारण यह मिलान किए गए फ़ाइलनाम को आउटपुट करने के लिए बाध्य करेगा। चालाक!
कोजिरो

-1

यदि आपका grep पुनरावर्ती -rध्वज का समर्थन करता है , तो यह आपके अनुरोध को हल करता है:

grep -rn "String to search " * 

1
यह सच है, लेकिन मैं यह नहीं देखता कि यह मौजूदा उत्तरों में क्या जोड़ता है।
वाइल्डकार्ड

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