मिलान के बाद केवल अगली पंक्ति कैसे दिखाएं?


218
grep -A1 'blah' logfile

इस कमांड के लिए धन्यवाद कि इसमें '' ब्लाह '' है, मुझे उस लाइन का आउटपुट मिलता है जिसमें 'blah' है और अगली लाइन जो लॉगफाइल में है। यह एक सरल हो सकता है, लेकिन मुझे उस लाइन को छोड़ना नहीं है जो 'ब्ला' है और केवल आउटपुट में अगली लाइन दिखाती है।


72
मुझे लगता है कि बहुत से लोग -A1विकल्प की तलाश में यहां आएंगे
मिरलॉन

फिर मैं अपने सार्वजनिक आईपी प्राप्त करने के लिए इसका उपयोग करता हूं। :)curl whatismyip.org | grep -A1 'Your IP Address'
shrekuu

6
इसी तरह -B1, -B2, -B3, -A1, -A2, -A3। । ।
मिवोप्लप

5
@ शेकेल कर्ल icanhazip.com (कोई grep की जरूरत नहीं है) :)
एलेक्सियोरेक

1
आपका सवाल मेरे प्रश्न का उत्तर ... -A1। धन्यवाद!
S3DEV

जवाबों:


181

आप जाग के साथ कोशिश कर सकते हैं:

awk '/blah/{getline; print}' logfile

3
किसी के लिए जो वास्तव में एक grep -A2 समतुल्य (जो मुझे चाहिए था) के लिए, getline बस लाइन खाती है और अगले पर जाती है। तो मेरे लिए जो काम किया वह सचमुच थाawk '/blah/{getline; getline; print}' logfile
हारून आर।

160

अगर आप जीआरपी से चिपके रहना चाहते हैं:

grep -A1 'blah' logfile|grep -v "blah"

या

sed -n '/blah/{n;p;}' logfile

2
@ टिप्पणी, टिप के लिए धन्यवाद। हालांकि मेरे POV से, grep बहुत अधिक पठनीय और आसान है, जो sed या awk उत्तर की तुलना में सबसे अच्छे उत्तर के रूप में
समझा जा

2
-V क्या करता है के बारे में उत्सुक लोगों के लिए: -v --invert- मैच गैर-मिलान लाइनों का चयन करने के लिए, मिलान की भावना को पलटना। (-v POSIX द्वारा निर्दिष्ट किया गया है।)
सम्मी

2
मैं वास्तव में इस उत्तर को पसंद करता हूं, लेकिन यह काम नहीं करेगा यदि आपके पास "ब्लाह" वाली एक पंक्ति में दो लाइनें हैं और दूसरा एक प्राप्त करना चाहते हैं (क्योंकि यह "मिलान के बाद अगली पंक्ति है")। मैं अपने सिर के ऊपर से इसके लिए किसी भी उपयोग के मामले के बारे में नहीं सोच सकता, लेकिन यह ध्यान देने योग्य है।
टिन विजार्ड

शीर्ष समाधान केवल "ठीक" है। यदि दूसरी पंक्ति में "ब्लाह" भी होता है, तो आपके हाथों पर एक वास्तविक गड़बड़ होगी।
रिवालक

32

पाइपिंग आपका दोस्त है ...

grep -A1एक मैच के बाद अगली लाइन दिखाने के लिए उपयोग करें , फिर परिणाम को पाइप करें tailऔर केवल 1 लाइन को पकड़ो,

cat logs/info.log | grep "term" -A1 | tail -n 1

1
यदि "पद" अंतिम पंक्ति पर है, तो यह पंक्ति को "पद" से वापस लौटाएगा, इसके बजाय आप क्या चाहते हैं।
अनाम

टेल-एन 1 केवल पूरी फ़ाइल की अंतिम पंक्ति का परिणाम देगा
सेबस्टियन

13

रायम का शानदार जवाब, मेरे लिए बहुत उपयोगी था। पैटर्न के बाद उदाहरण पंक्ति 7 को प्रिंट करने के लिए इसे विस्तारित करना तुच्छ है

awk -v lines=7 '/blah/ {for(i=lines;i;--i)getline; print $0 }' logfile

9

यदि उस अगली पंक्तियों में कभी 'ब्लाह' न हो, तो आप उन्हें फ़िल्टर कर सकते हैं:

grep -A1 blah logfile | grep -v blah

के उपयोग की cat logfile | ...आवश्यकता नहीं है।


5

सामान्य तौर पर, मैं मानता हूँ कि आप यहाँ बहुत सारे grep पूछ रहे हैं, और यह कि एक और उपकरण बेहतर समाधान हो सकता है। लेकिन एक एम्बेडेड वातावरण में, मैं यह करने के लिए sedया awkबस करने के लिए नहीं करना चाहता हो सकता है । मुझे निम्नलिखित समाधान कार्य मिले (जब तक वे सन्निहित मैच नहीं होते):

grep -A1 AT\+CSQ wvdial.out | grep -v AT\+CSQ

मूल रूप से, उनका मिलान करें, प्रत्येक मैच के लिए संदर्भ की 1 पंक्ति को जोड़ते हुए, और फिर उसे बाहर निकालने के लिए अपने मूल पैटर्न के व्युत्क्रम मिलान के माध्यम से पाइप करें। यह निश्चित रूप से इसका मतलब है कि आप मान सकते हैं कि आपका पैटर्न "अगली" पंक्ति में दिखाई नहीं देता है।


5

इस सवाल के अब तक कई अच्छे जवाब दिए गए हैं, लेकिन मैं अभी भी एक awkका उपयोग नहीं करने के साथ याद आती है getline। चूंकि, सामान्य तौर पर , इसका उपयोग करना आवश्यक नहीं है getline, मैं इसके लिए जाऊंगा:

awk ' f && NR==f+1; /blah/ {f=NR}' file  #all matches after "blah"

या

awk '/blah/ {f=NR} f && NR==f+1' file   #matches after "blah" not being also "blah"

तर्क हमेशा उस रेखा को संचय करने में होता है जहाँ "ब्ला" पाया जाता है और फिर उन पंक्तियों को मुद्रित किया जाता है जो एक पंक्ति के बाद होती हैं।

परीक्षा

नमूना फ़ाइल:

$ cat a
0
blah1
1
2
3
blah2
4
5
6
blah3
blah4
7

"ब्लाह" के बाद सभी पंक्तियों को प्राप्त करें। यह एक और "ब्लाह" को प्रिंट करता है यदि यह पहले एक के बाद दिखाई देता है।

$ awk 'f&&NR==f+1; /blah/ {f=NR}' a
1
4
blah4
7

"ब्लाह" के बाद सभी पंक्तियों को प्राप्त करें यदि उनके पास "ब्ला" न हो।

$ awk '/blah/ {f=NR} f && NR==f+1' a
1
4
7

5

मुझे grep के साथ ऐसा करने का कोई तरीका नहीं पता है, लेकिन समान परिणाम प्राप्त करने के लिए awk का उपयोग करना संभव है:

awk '/blah/ {getline;print}' < logfile

@jww कोई अंतर नहीं है। जैसा कि आप टाइमस्टैम्प से देख सकते हैं जो सिर्फ मिनटों के अलावा हैं, ऐसा प्रतीत होता है कि मैंने उसी समय के आसपास जवाब दिया।
19

4

पर्ल वन-लाइनर अलर्ट

सिर्फ मनोरंजन के लिए ... मैच के बाद केवल एक लाइन प्रिंट करें

perl -lne '$next=($.+1)if/match/;$.==$next&&print' data.txt

और भी मजेदार ... मैच के बाद अगली दस पंक्तियों को प्रिंट करें

perl -lne 'push@nexts,(($.+1)..($.+10))if/match/;$.~~@nexts&&print' data.txt

थोथा धोखा हालांकि वहाँ वास्तव में दो आदेश है


क्या आप $ = == $ की व्याख्या कर सकते हैं? स्पष्ट रूप से यह $ अगले के साथ वर्तमान लाइन नंबर की संख्यात्मक तुलना से अधिक है, लेकिन मुझे समझ नहीं आता कि यह कैसे / क्यों काम करता है।
कीथ बेंट्रुप

यह इससे ज्यादा नहीं है। $. == $next && printके रूप में ही हैprint if $. == $next
beasy

आह, मैं अब देखता हूं। धन्यवाद! 2 भागों में से, प्रत्येक सत्य है और लूप के अलग, आसन्न पुनरावृत्तियों पर निष्पादित होता है। मुझे लगता है कि अगर बिंदु किसी भी मैच के बाद किसी भी लाइन को प्रिंट करना था जिसे आप ऑर्डर को उल्टा करना चाहेंगे (अधिक व्यवहार करेंगे grep -A1)। यदि आप केवल अगली पंक्तियों को प्रिंट करना चाहते हैं, लेकिन कभी भी एक रेखा नहीं है, तो आप इसे इस क्रम में रखेंगे। (सिर्फ यह देखते हुए कि अगले मैचों के लिए $ $ कितना बरबाद होगा)
कीथ बेंट्रुप

3

ऐसा लगता है कि आप वहां गलत टूल का उपयोग कर रहे हैं। ग्रीप वह परिष्कृत नहीं है, मुझे लगता है कि आप नौकरी के लिए टूल के रूप में जागना चाहते हैं:

awk '/blah/ { getline; print $0 }' logfile

अगर आपको कोई समस्या आती है तो मुझे बताएं, मुझे लगता है कि यह अच्छी तरह से सीखने के लायक है, यह एक महान उपकरण है :)

ps यह उदाहरण 'कैट अवार्ड का बेकार उपयोग' नहीं जीतता;) http://porkmail.org/era/unix/award.html


3
BTW, आप प्रिंट में "$ 0" छोड़ सकते हैं।
मिशैल errajer

0

grep / पैटर्न / | पूंछ -n 2 | सिर-एन १

टेल 2 पहले और फिर सिर पिछले एक मैच के बाद पहली पंक्ति पाने के लिए।

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