मैं कैसे bash में grep परिणाम के पहले / बाद में लाइनें ला सकता हूं?


151

नमस्ते मैं प्रोग्रामिंग को कोसने के लिए बहुत नया हूँ। मुझे दिए गए पाठ में खोज करने का एक तरीका चाहिए। इसके लिए मैं grepफ़ंक्शन का उपयोग करता हूं :

grep -i "my_regex"

यह काम करता है। लेकिन dataइस तरह दिया :

This is the test data
This is the error data as follows
. . . 
. . . .
. . . . . . 
. . . . . . . . .
Error data ends

एक बार जब मैंने शब्द पाया error(उपयोग कर grep -i error data), मैं शब्द का अनुसरण करने वाली 10 पंक्तियों को खोजना चाहता हूं error। तो मेरा उत्पादन होना चाहिए:

    . . . 
    . . . .
    . . . . . . 
    . . . . . . . . .
    Error data ends

क्या इसे करने के कोई तरीके हैं?


आपके विवरण से ऐसा लगता है कि आप शब्द को आगे बढ़ाने वाली 10 लाइनें चाहते हैं error
थॉमस डब्ल्यू

जवाबों:


266

आप उपयोग कर सकते हैं -Bऔर -Aपहले और मैच के बाद लाइनों मुद्रित करने के लिए।

grep -i -B 10 'error' data

मैच से पहले 10 लाइनों को प्रिंट करेगा, जिसमें मैचिंग लाइन भी शामिल है।


1
धन्यवाद यह काम कर रहा है। लेकिन जब मैंने इस निष्पादन को इस तरह से चर में संग्रहीत करने की कोशिश की test=$(grep -i -B 10 'error' data), और इसका उपयोग करके प्रिंट किया echo $test, तो मुझे आउटपुट के रूप में सीधी लंबी लाइनें मिलती हैं।
श्रीराम

1
धन्यवाद मुझे लगा कि मुझे इसके echo "$test"बजाय ऐसा करने की आवश्यकता हैecho $test
श्रीराम

25
-C 10पहले 10 लाइनें छपेंगी और एक के बाद एक झपट्टा मारना होगा!
जोशुआ पिंटर

वहाँ बिंदु से पहले एक विशिष्ट का उपयोग कर ऐसा करने का एक तरीका है? मैं जिस लंबाई को पहले पकड़ता हूं वह परिवर्तनशील है?
एरुडकी

31

यह मिलान लाइनों के बाद अनुगामी संदर्भ की 10 पंक्तियों को प्रिंट करता है

grep -i "my_regex" -A 10

यदि आपको मिलान लाइनों से पहले प्रमुख संदर्भ की 10 लाइनें प्रिंट करने की आवश्यकता है,

grep -i "my_regex" -B 10

और यदि आपको आउटपुट संदर्भ के अग्रणी और अनुगामी की 10 पंक्तियों को प्रिंट करने की आवश्यकता है।

grep -i "my_regex" -C 10

उदाहरण

user@box:~$ cat out 
line 1
line 2
line 3
line 4
line 5 my_regex
line 6
line 7
line 8
line 9
user@box:~$

सामान्य grep

user@box:~$ grep my_regex out 
line 5 my_regex
user@box:~$ 

Grep सटीक मिलान लाइनों और 2 लाइनों के बाद

user@box:~$ grep -A 2 my_regex out   
line 5 my_regex
line 6
line 7
user@box:~$ 

ग्रीप सटीक मिलान लाइनों और 2 लाइनों से पहले

user@box:~$ grep -B 2 my_regex out  
line 3
line 4
line 5 my_regex
user@box:~$ 

पहले और बाद में सटीक मिलान रेखाएँ और 2 पंक्तियाँ

user@box:~$ grep -C 2 my_regex out  
line 3
line 4
line 5 my_regex
line 6
line 7
user@box:~$ 

संदर्भ: मैनपेज grep

-A num
--after-context=num

    Print num lines of trailing context after matching lines.
-B num
--before-context=num

    Print num lines of leading context before matching lines.
-C num
-num
--context=num

    Print num lines of leading and trailing output context.

3
अच्छा, ive को अभी कुछ समय देखना था, शायद मैं इसे (FTER) -B (EFORE) -C (ONTEXT)
Opentuned

11

ऐसा करने का तरीका मैन पेज के शीर्ष के पास है

grep -i -A 10 'error data'

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