grep एक फ़ाइल है, लेकिन आसपास की कई लाइनें दिखाती हैं?


3414

मैं grepएक स्ट्रिंग के लिए चाहूंगा , लेकिन पूर्ववर्ती पांच पंक्तियों और निम्नलिखित पांच पंक्तियों के साथ-साथ मिलान की गई रेखा को भी दिखाऊंगा। मैं यह कैसे कर पाऊंगा?


3
मैं इस उद्देश्य के लिए ब्रेंडन ग्रेग की पर्ल स्क्रिप्ट की एक प्रति अपने पास रखता हूं । अच्छा काम करता है।
ईथन पोस्ट

6
सोलारिस पर काम करने वाले समाधान के लिए, इस लिंक को देखें
जहरॉय

106
man grep | grep -C 1 context:)
स्टैनव्यू

20
man grep | grep -C 1 "\-C";)
एंडर्स बी

9
@StvnW ... मुझे नहीं पता कि उस मेटा को कॉल करना है (अधिक सामान्य रूप में, एसओ संदर्भ के बजाय), या इसे कॉल करने के लिए क्या करना है। आपने प्रश्न का उत्तर यह दिखा कर दिया कि उत्तर खोजने के लिए उत्तर का उपयोग कैसे करें।
bldldave025

जवाबों:


4531

के लिए बीएसडी या जीएनयू grep आप उपयोग कर सकते हैं -B numमैच से पहले और कितने लाइनों सेट करने के लिए -A numमैच के बाद लाइनों की संख्या के लिए।

grep -B 3 -A 2 foo README.txt

यदि आप उपयोग करने से पहले और बाद में समान पंक्तियाँ चाहते हैं -C num

grep -C 3 foo README.txt

यह 3 लाइनों को पहले और 3 लाइनों को बाद में दिखाएगा।


56
यह अच्छा है लेकिन दुर्भाग्य से सोलारिस ग्रीप इसका समर्थन नहीं करता है। सोलारिस के
рüффп

9
ठीक है, लेकिन क्या होगा अगर मैच के बाद आउटपुट की सभी लाइनें दिखाना चाहते हैं? grep -A0 और grep -A-1 इसे नहीं काटते ...
g33kz0r

2
किसी कारण से मेरे लिए काम नहीं करता है, हालांकि मेरे मैन पेजों में उल्लेख किया गया है।
हैदरी उउतुर कोल्टुक

2
यदि आप HP-UX env हैं, तो कोई भी grep संस्करण सोलारिस की तरह काम नहीं करेगा। सोलारिस लिंक का उपयोग करने में सक्षम था लेकिन उस लिंक में awk के साथ nawk को बदल दिया।
जकार्तिक २३'१३

6
-n लाइन नंबरों के लिए है, लेकिन grep के कुछ संस्करणों के लिए -n # लाइन नंबरों के साथ # आस-पास की लाइनें (जैसे -c) दिखाएगा। यह एक उपयोगी शार्टकट है जो मेरे लिए है जब मुझे संदर्भ की आवश्यकता होती है।
एंथनी डिसेंटी

607

-Aऔर -Bकाम करेंगे, इच्छा के रूप में -C n(के लिए n, या बस संदर्भ की तर्ज) -n(के लिए nसंदर्भ की तर्ज ... जब तक कि एन 1 से 9 तक है)।


मैंने -nप्रारूप की कोशिश की और पता चला कि यह केवल तब तक काम करता है 9। इसके लिए 155 पंक्तियाँ
दीपक महाकले

7
@DeepakMahakale यह संभवतः संबंधित है कि कैसे कमांड-लाइन तर्क / विकल्प आमतौर पर POSIX कार्यक्रमों द्वारा पार्स किए जाते हैं। विकल्प विनिर्देशक एक एकल वर्ण (जैसे -A, -Bया -C) है। आमतौर पर, विकल्प निर्दिष्टकर्ता का मान ( -o a.outGCC में आउटपुट फ़ाइल निर्दिष्ट करने के लिए) होता है, लेकिन यह एक साधारण स्विच / ध्वज के रूप में भी कार्य कर सकता है ( -gGCC में डिबगिंग जानकारी सक्षम करने के लिए)। हालांकि विकल्पों के बीच रिक्त स्थान, वैकल्पिक हैं तो एक मूल्य के बिना विकल्पों के लिए, यह उन्हें एक करना (संभव है -ABC) है, जो मतलब है कि -15व्याख्या की है -1 -5(दो अलग विकल्प) और -5ओवरराइड -1
नैटिक्स

1
-5, दोनों -5 -5 बी से तेज है। उन लोगों को एक साथ इस्तेमाल करने के लिए नहीं है। यदि आप -B या -C ओवर -9 चुनते हैं तो यह स्क्रिप्ट के अन्य पाठकों के लिए क्लीनर है।
एरिक एल्डिंगर

76

are grep के समान तर्कों के साथ काम करता है, और स्वीकार करता है -C। लेकिन आमतौर पर कोड के माध्यम से खोज करना बेहतर होता है।


5
ack भी -B का समर्थन करती है।
Shuo

Ack कई मायनों में grep से बेहतर है। यह एक सरल वाक्य रचना के साथ तेज है।
चिम

1
grep को कई प्रणालियों पर डिफ़ॉल्ट रूप से स्थापित होने का फायदा होता है।
मार्क ज़ेड

1
@ मर्कज़: सच है, जीआरपी डिफ़ॉल्ट रूप से एएसी की तुलना में स्थापित होने की अधिक संभावना है, लेकिन एर्क एक पोर्टेबल, स्टैंड-अलोन स्क्रिप्ट है। इसे संकलित करने या सिस्टम निर्देशिका जैसे / usr / bin / में संस्थापित करने की कोई आवश्यकता नहीं है। एक बार जब इसे डाउनलोड किया जाता है और $ PATH (और इसके eXecute अनुमति बिट सेट) में सूचीबद्ध निर्देशिका में रखा जाता है, तो इसे तुरंत काम करना चाहिए। (काम करने के लिए अकड़ पाने के लिए किसी सूडो या रूट विशेषाधिकारों की आवश्यकता नहीं होती है।)
जेएल

यह प्रश्न grep"विज्ञापन" के लिए इसका उपयोग करने के बारे में निश्चित नहीं है ack(जो कि एक महान उपकरण है, वास्तव में) एक अच्छा विचार है ...
MonsieurDart

39
grep astring myfile -A 5 -B 5

यह "एस्ट्रिंग" के लिए "मायफाइल" को grep करेगा, और प्रत्येक मैच से पहले और बाद में 5 लाइनें दिखाएगा


19
"grep astring myfile -C 5" वही करेगा
सैयद सिराज उद्दीन

20

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

grep searchstring file -C n # n for number of lines of context up and down

Grep जैसे कई टूल में वास्तव में बहुत बढ़िया मैन फाइल्स भी हैं। मैं खुद को grep के मैन पेज का जिक्र करता हूं क्योंकि इसमें बहुत कुछ है जो आप इसके साथ कर सकते हैं।

man grep

कई जीएनयू टूल में एक सूचना पृष्ठ भी होता है जिसमें मैन पेज के अलावा अधिक उपयोगी जानकारी हो सकती है।

info grep

13

Grep का उपयोग करें

$ grep --help | grep -i context
Context control:
  -B, --before-context=NUM  print NUM lines of leading context
  -A, --after-context=NUM   print NUM lines of trailing context
  -C, --context=NUM         print NUM lines of output context
  -NUM                      same as --context=NUM

क्या आपने स्वीकृत उत्तर नहीं पढ़ा? आप सिर्फ वही दोहरा रहे हैं जो पहले से ही लगभग 10 साल पुराने एक सवाल पर कहा जा चुका है ...
योकाई

7
ओह आई एम सॉरी योकाई। लेकिन मैंने उत्तर को पुनः प्राप्त करने के लिए grep के सहायता अनुभाग को तैयार करने के बारे में कुछ नहीं पढ़ा।
चायल दस ब्रिंक

1
@ योकाई के अलावा चील दस ब्रिंक ने क्या कहा, स्वीकार किए गए उत्तर में लंबे विकल्पों का उल्लेख नहीं है
user3738870

10

"17655" के लिए "/some/file.txt" में 10 लाइनों का संदर्भ दिखाते हुए पहले और बाद में (Awk का उपयोग करते हुए), आउटपुट एक कॉलोनी के बाद लाइन नंबर के साथ पहले हुआ। सोलारिस पर इसका उपयोग तब करें जब 'grep' "- [ACB]" विकल्पों का समर्थन नहीं करता है।

awk '

/17655/ {
        for (i = (b + 1) % 10; i != b; i = (i + 1) % 10) {
                print before[i]
        }
        print (NR ":" ($0))
        a = 10
}

a-- > 0 {
        print (NR ":" ($0))
}

{
        before[b] = (NR ":" ($0))
        b = (b + 1) % 10
}' /some/file.txt;

7

ripgrep

यदि आप प्रदर्शन के बारे में परवाह करते हैं, तो ripgrepउसी तरह के सिंटैक्स का उपयोग करें grep, जैसे

rg -C5 "pattern" .

-C, --context NUM- दिखाएँ NUM पंक्तियाँ से पहले और प्रत्येक मैच के बाद।

ऐसे -A/ --after-contextऔर -B/ जैसे पैरामीटर भी हैं --before-context

टूल रुस्ट के रेगेक्स इंजन के ऊपर बनाया गया है जो इसे बड़े डेटा पर बहुत कुशल बनाता है ।


5

यहाँ @Ygor समाधान हैawk

awk 'c-->0;$0~s{if(b)for(c=b+1;c>1;c--)print r[(NR-c+1)%b];print;c=a}b{r[NR%b]=$0}' b=3 a=3 s="pattern" myfile

नोट: पहले और बाद में लाइनों की संख्या के साथ बदलें aऔर bचर।

यह विशेष रूप से सिस्टम के लिए उपयोगी है जो grep -A, -Bऔर -Cमापदंडों का समर्थन नहीं करता है ।


4
$ grep thestring thefile -5

-5आपको 5मैच के ऊपर और नीचे लाइनें मिलती हैं , 'थ्रीस्ट्रिंग' -C 5या उसके बराबर है -A 5 -B 5


4

Grep में एक विकल्प होता है Context Line Control, आप --contextउस में, बस,

| grep -C 5

या

| grep -5

चाल चलनी चाहिए


1

मैं कॉम्पैक्ट तरीके से करने के लिए उपयोग करता हूं

grep -5 string file

के बराबर है

grep -A 5 -B 5 string file

0

यदि आप अक्सर कोड खोजते हैं, तो जीआरई की तुलना में एजी सिल्वर खोजकर्ता अधिक कुशल (यानी तेज) है।

आप -C विकल्प का उपयोग करके संदर्भ लाइनें दिखाते हैं।

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

ag -C 3 "foo" myFile

line 1
line 2
line 3
line that has "foo"
line 5
line 6
line 7
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.