मिलान रेखा से पहले फ़ाइल नाम प्रदर्शित करें


282

मैं grepअपने आउटपुट में मिलान लाइनों से पहले फ़ाइल नाम कैसे प्रदर्शित कर सकता हूं ?


2
pls अपना grep संस्करण बताएंgrep --version
Kent

3
kent, grep --versionयह है कि grep संस्करण को जानने के लिए किस कमांड का उपयोग किया जाना है? यदि हां, तो इसका काम नहीं हो रहा है। Grep संस्करण को जानने के लिए कोई अन्य कमांड नहीं ढूंढ सका।
विवेक

2
अच्छा सवाल है, लेकिन 'ओएस संस्करण' एक भ्रामक उदाहरण फ़ाइल नाम है
हैवेगस

1
OS और संस्करण यहां अप्रासंगिक है।
एमडी एक्सएफ

grep 'pattern' *
user0

जवाबों:


430

समाक्ष को यह थोड़ा चाल की कोशिश करो grepसोच यह एक से अधिक फ़ाइलों के साथ काम कर रहा है में, इतना है कि यह फ़ाइल नाम प्रदर्शित करता है:

grep 'pattern' file /dev/null

लाइन नंबर पाने के लिए:

grep -n 'pattern' file /dev/null

6
हाँ, यह काम किया। क्या आप मुझे बता सकते हैं कि /dev/nullइस कमांड में जोड़ने का क्या महत्व है ?
विवेक

55
यदि grepकई फ़ाइल नामों के साथ आपूर्ति की जाती है, तो यह मैच से पहले फ़ाइल नामों को स्वचालित रूप से प्रदर्शित करेगा, लेकिन यह एकल इनपुट फ़ाइल के मामले में फ़ाइल नाम को छोड़ देगा। /dev/nullएक अतिरिक्त इनपुट फ़ाइल के रूप में उपयोग करने से grep"सोचता है" यह कई फाइलों से निपटता है, लेकिन / dev / null निश्चित रूप से खाली है, इसलिए यह मैच सूची में नहीं दिखाई देगा ..
स्क्रूटिनीज़र

32
/ dev / null का उपयोग करना एक चतुर चाल है, लेकिन मुझे लगता है कि -H ध्वज के नीचे का सुझाव एक बेहतर उत्तर है।
जॉन क्यू

22
ठीक है, लेकिन -Hgrep का विकल्प POSIX का हिस्सा नहीं है, और उपयोग किया जाने वाला OS Solaris 10 है, जहां न तो मानक grep है, और न ही Grep के POSIX अनुरूप संस्करण का -Hविकल्प है।
स्क्रूटिनीजर

4
यदि आप खोज के साथ grep का उपयोग कर रहे हैं, तो यह महत्वपूर्ण है, जैसे find . -name foo -exec grep pattern {} \;- fooआपकी उपनिर्देशिका में नामित बहुत सारी फाइलें , findअभी भी grepएक बार में संचालित करने के लिए एक ही फ़ाइल को सौंपती है। /dev/nullचाल सभी linux / OSX जायके है कि मैं कोशिश की है में काम करने के लिए लगता है, इसलिए प्रशंसा! नोट मुझे लगता है कि -Hक्लीनर है, लेकिन जैसा कि नीचे उल्लेख किया गया है, यह आपके संस्करण के साथ समर्थित नहीं हो सकता है grep
जॉन वी।

296

यदि आपके पास विकल्प -Hऔर -nउपलब्ध है ( man grepआपका दोस्त है):

$ cat file
foo
bar
foobar

$ grep -H foo file
file:foo
file:foobar

$ grep -Hn foo file
file:1:foo
file:3:foobar

विकल्प:

-एच, --with-filename

प्रत्येक मैच के लिए फ़ाइल का नाम प्रिंट करें। यह डिफ़ॉल्ट है जब खोज करने के लिए एक से अधिक फ़ाइल है।

-n, - लाइन-संख्या

अपनी इनपुट फ़ाइल के भीतर 1-आधारित लाइन नंबर के साथ आउटपुट की प्रत्येक पंक्ति को उपसर्ग करें। -n POSIX द्वारा निर्दिष्ट है।)

-Hएक जीएनयू विस्तार है, लेकिन -nहै POSIX द्वारा निर्दिष्ट


3
नहीं, -Hयहाँ समर्थित नहीं है।
विवेक

1
समर्थित लेकिन यह हमेशा grep देता है: फ़ाइल: ऐसी कोई फ़ाइल या निर्देशिका नहीं
pal4life

2
ubuntu -H और -n पर काम करता है। संभवतः * nix के सभी नए संस्करणों के साथ
tgkprog

1
मैं शाम तक बिना सोचे समझे संघर्ष करता रहा कि ये विकल्प थे!
ग्रीनसगुरो

45

कोई ट्रिक जरूरी नहीं।

grep --with-filename 'pattern' file

लाइन नंबरों के साथ:

grep -n --with-filename 'pattern' file

3
@codeforester मैं किसी अन्य grepएस के बारे में नहीं जानता , इसलिए मुझे नहीं पता।
एमडी एक्सएफ

2
ठंडा ! इस linux के लिए काम किया। यदि आप मैक का उपयोग करते हैं, तो काढ़ा के साथ कोरुटिल स्थापित कर सकते हैं। और याद रखें कि PATH = "/ usr / local / opt / coreutils / libexec / gnubin: $ PATH" को अपने साथ .bashrc
zw963

2
यह (यह भी) मिनगडब्ल्यू (1.0.17, मुझे लगता है) में काम किया ।
पीटर मोर्टेंसन

यह मेरे लिए अंतर्निहित मैक grep (2.5.1-FreeBSD) के साथ काम करता है। लेकिन होमब्रे से वैकल्पिक ग्रीप का उपयोग करने के लिए, एक और तरीका चलाना है brew install grepऔर फिर बस उपयोग करना है ggrep। पथ को संशोधित करने की आवश्यकता नहीं है।
Wonderlr

5

इस बारे में कैसे, जिसे मैं इस पोस्ट में, भाग में, धन्यवाद प्राप्त करने में कामयाब रहा।

आप कई फ़ाइलों को ढूंढना चाहते हैं, विभिन्न नामों के साथ लॉग कहते हैं, लेकिन एक पैटर्न (जैसे filename=logfile.DATE), एक पैटर्न (उदाहरण /logsapp1, /logsapp2) के साथ कई निर्देशिकाओं के अंदर । प्रत्येक फ़ाइल में एक पैटर्न होता है जिसे आप grep (जैसे "init time") करना चाहते हैं, और आप "init time"प्रत्येक फ़ाइल का होना चाहते हैं , लेकिन यह जानना कि यह किस फ़ाइल का है।

find ./logsapp* -name logfile* | xargs -I{} grep "init time" {} \dev\null | tee outputfilename.txt

फिर outputfilename.txtकुछ ऐसा होगा

./logsapp1/logfile.22102015: init time: 10ms
./logsapp1/logfile.21102015: init time: 15ms
./logsapp2/logfile.21102015: init time: 17ms
./logsapp2/logfile.22102015: init time: 11ms

सामान्य रूप में

find ./path_pattern/to_files* -name filename_pattern* | xargs -I{} grep "grep_pattern" {} \dev\null | tee outfilename.txt

स्पष्टीकरण:

find कमांड पैटर्न में स्थित फाइलनाम को खोजेगा

फिर, पाइप आउटपुट को xargs -I{}रीडायरेक्ट करेगाfind{}

जिसके लिए इनपुट होगा grep ""pattern" {}

फिर grepफ़ाइल नाम प्रदर्शित करने की चाल\dev\null

और अंत में, फ़ाइल के साथ आउटपुट लिखें tee outputfile.txt

यह मेरे लिए grepसंस्करण 9.0.5 के निर्माण में 1989 में काम किया ।


3
या सिर्फ खोजने के लिए उपयोग करेंfind ./path_pattern/to_files -type f -name "files*.log" -exec grep -Hn pattern {} \;
मार्टिन

1

यह पिछले समाधान से एक मामूली संशोधन है। मेरा उदाहरण bash स्क्रिप्ट में stderr पुनर्निर्देशन के लिए दिखता है: grep '2>' $(find . -name "*.bash")


-7
grep 'search this' *.txt

मेरे लिए सभी .txt फ़ाइलों के माध्यम से खोज करने के लिए काम किया (अपनी खुद की खोज मूल्य दर्ज करें, बिल्कुल)।

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