केवल पंक्ति संख्या वापस रिपोर्ट करने के लिए grep का उपयोग करें


105

मेरे पास एक फ़ाइल है जिसमें संभवतः खराब स्वरूपण है (इस मामले में, पैटर्न की घटना \\backslash)। मैं grepकेवल उन लाइन नंबरों का उपयोग करना चाहूंगा जहां ऐसा होता है (जैसा कि, मैच यहां था, लाइन # x पर जाएं और इसे ठीक करें)।

हालांकि, लाइन नंबर ( grep -n) प्रिंट करने का कोई तरीका नहीं है और न ही मैच या लाइन को प्रिंट करने का कोई तरीका है।

मैं लाइन नंबर निकालने के लिए एक और regex का उपयोग कर सकता हूं, लेकिन मैं यह सुनिश्चित करना चाहता हूं कि grep इसे स्वयं नहीं कर सकता। grep -noसबसे पास आता है, मुझे लगता है, लेकिन फिर भी मैच को प्रदर्शित करता है।


1
मेरे लिए सबसे उपयोगी उत्तर प्रश्न में था grep -no:! यह वही है जो मैं करने की कोशिश करने के लिए यहां आया था! (यानी उस लाइन को प्रिंट न करें जो कभी-कभी बहुत लंबी होती है, उदाहरण के लिए, जावास्क्रिप्ट जावास्क्रिप्ट स्रोत फाइलें।)
लंदनरॉब

जवाबों:


156

प्रयत्न:

grep -n "text to find" file.ext | cut -f1 -d:

1
मेरी मशीन पर, यह केवल बिना लाइन नंबरों के मिलान की गई फाइलों को प्रिंट कर रहा है (इसलिए अगर मेरे पास एक फ़ाइल के अंदर 3 मैच हैं, तो यह केवल एक बार ही प्रिंट होता है) जो अभी भी बहुत उपयोगी है ...
मारियो अवध

3
@ मोरियोअवड, आपको -fपरम में हेरफेर करना चाहिए । मेरे लिए यह था -f2। (यह पुराने सामान है, लेकिन मुझे लगता है कि यह कुछ गरीब आत्माओं की मदद कर सकता है)
एमिल Sierżęga

सुंदर पुराने यूनिक्स एडहॉक शेल स्क्रिप्टिंग के लिए धन्यवाद। इससे पता चलता है कि लचीले उपकरण उनकी जटिलता और सीखने की अवस्था के लायक हैं!
एलेक्स

12
grep -n "text to find" file.ext | cut -f1,2 -d:फ़ाइल का नाम और लाइन नंबर दिखाता है।
जोंडलम

2
@ जॉन्डिम केवल फ़ाइल नाम दिखाता है अगर एक से अधिक फ़ाइल खोजी जा रही है; -Hफ़ाइल नाम दिखाने के लिए आपको केवल एक फ़ाइल होने के लिए उसे जोड़ने के लिए जोड़ने की आवश्यकता है । इसके विपरीत, आप इसे हमेशा -hयह बताने के लिए उपयोग कर सकते हैं कि आप चाहे कितनी भी फ़ाइल का उपयोग क्यों न कर रहे हों, फ़ाइल नाम का उत्पादन नहीं करें।
मार्क रीड

45

यदि आप AWK का उपयोग करने के लिए खुले हैं:

awk '/textstring/ {print FNR}' textfile

इस मामले में, एफएनआर लाइन नंबर है। जब आप grep देख रहे हों, तो AWK एक बढ़िया उपकरण है। कट, या किसी भी समय आप grep आउटपुट लेना चाहते हैं और इसमें हेरफेर करते हैं।


2
एक प्रक्रिया का उपयोग करता है (जो अतीत में अधिक मायने रखता है, लेकिन अभी भी), और जाग शुरुआती के लिए समझने में काफी आसान है!
bgStack15

NRजब इस मामले में केवल एक फ़ाइल की जांच की जा रही है, तब भी काम करता है।
मार्क रीड 14

बस शानदार! यह बहुत तेज है!
GTodorov

34

इन सभी उत्तरों को संपूर्ण मिलान लाइनों को उत्पन्न करने के लिए grep की आवश्यकता होती है, फिर इसे किसी अन्य प्रोग्राम में पाइप करें। यदि आपकी लाइनें बहुत लंबी हैं, तो लाइन संख्याओं को आउटपुट करने के लिए बस sed का उपयोग करना अधिक कुशल हो सकता है:

sed -n '/pattern/=' filename

2

बैश संस्करण

    lineno=$(grep -n "pattern" filename)
    lineno=${lineno%%:*}

1
और क्या होता है अगर एक से अधिक लाइन उस पैटर्न से मेल खाती है?
izabera

@izabera जोड़ें | पूंछ -1
डिएगो

1

मैं के साथ जवाब की सलाह देते हैं sedऔर awkसिर्फ लाइन नंबर हो रही है, बजाय प्रयोग करने के लिए grepपूरे मिलान लाइन प्राप्त करने के लिए और फिर से उत्पादन से निकालने कि cutया किसी अन्य उपकरण। पूर्णता के लिए, आप पर्ल का भी उपयोग कर सकते हैं:

perl -nE '/pattern/ && say $.' filename

या रूबी:

ruby -ne 'puts $. if /pattern/' filename

0

आप बृहदान्त्र के बाद दूसरा क्षेत्र चाहते हैं, पहला नहीं।

grep -n "text to find" file.txt | cut -f2 -d:


यह काम करता है यदि आप पाठ से मेल खाना चाहते हैं, लेकिन मामले में ओपी के लिए लाइन नंबर क्या था।
एजेपी

0

पैटर्न से मिलान लाइनों की संख्या की गणना करने के लिए:

grep -n "Pattern" in_file.ext | wc -l 

मिलान पैटर्न निकालने के लिए

sed -n '/pattern/p' file.est

लाइन संख्या प्रदर्शित करने के लिए जिस पैटर्न पर मिलान किया गया था

grep -n "pattern" file.ext | cut -f1 -d:

2
1 को बस "grep -c 'पैटर्न' in_file.ext" होना चाहिए। दूसरा "grep -o 'पैटर्न' in_file.ext" होना चाहिए। इसमें sed या wc को शामिल करने की आवश्यकता नहीं है।
thelogix

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