মেলে একের পরের লাইনটি কীভাবে প্রদর্শন করবেন?


218
grep -A1 'blah' logfile

এই কমান্ডটির জন্য প্রতিটি লাইনের 'ব্লাহ' রয়েছে বলে ধন্যবাদ জানাতে, আমি 'ব্লা'এর লাইন এবং লগফাইলে অনুসরণ করা পরবর্তী লাইনের আউটপুট পাই get এটি একটি সহজ হতে পারে তবে আমি 'ব্লাহ' রেখাটি বাদ দিতে এবং আউটপুটে কেবল পরবর্তী লাইনটি দেখানোর উপায় খুঁজে পাচ্ছি না ।


72
আমি মনে করি অনেক লোক এখানে -A1বিকল্পের সন্ধান করতে আসবে
মাইরেলন

তারপরে আমি আমার সার্বজনীন আইপি পেতে এটি ব্যবহার করি। :)curl whatismyip.org | grep -A1 'Your IP Address'
shrekuu

6
একইভাবে -বি 1, -বি 2, -বি 3, -এ 1, -এ 2, -এ 3। । ।
meawoppl

5
@ শেরেক কার্ল আইকানহাজিপ.কম (কোনও গ্রেপের প্রয়োজন নেই) :)
আলেক্সিওর্ক

1
তোমার প্রশ্ন আমার প্রশ্নের উত্তর ... -A1। ধন্যবাদ!
এস

উত্তর:


181

আপনি কুয়াশা দিয়ে চেষ্টা করতে পারেন:

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

3
যে কেউ সত্যিকার অর্থে গ্রেপ-এ 2 সমতুল্য (যা আমার প্রয়োজন তা) চেয়েছিল, গেটলাইন কেবল লাইনটি খায় এবং পরবর্তীটিতে চলে যায়। সুতরাং আমার জন্য যা কাজ করেছিল তা আক্ষরিকভাবে ছিলawk '/blah/{getline; getline; print}' logfile
অ্যারন আর।

160

আপনি গ্রেপ আটকে রাখতে চান:

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

অথবা

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

2
@ কেন্ট, টিপটির জন্য ধন্যবাদ। যদিও আমার
পিওভির থেকে, গ্রেড সিডের তুলনায় গ্রেড

2
কী -v সম্পর্কে কৌতূহল রয়েছে তাদের জন্য: -v --invers-ম্যাচটি অ-ম্যাচিং লাইনগুলি নির্বাচন করতে, মিলের অনুভূতিটি উল্টান। (-ভিটি পসিক্স দ্বারা নির্দিষ্ট করা হয়েছে))
সামি

2
আমি এই উত্তরটি সত্যিই পছন্দ করি তবে আপনার যদি "ব্লাহ" যুক্ত সারিতে দুটি রেখা থাকে এবং দ্বিতীয়টি পেতে চান তবে এটি কার্যকর হবে না (কারণ এটি "মিলে যাওয়ার পরে পরবর্তী লাইন")। আমি তার জন্য আমার মাথার উপরের দিকের কোনও ব্যবহারের ক্ষেত্রে ভাবতে পারি না, তবে এটি লক্ষ্য করার মতো।
টিন উইজার্ড

শীর্ষ সমাধানটি কেবল "ঠিক আছে"। যদি দ্বিতীয় লাইনেও "ব্লা" থাকে তবে আপনার হাতে একটি সত্যিকারের জগাখিচুড়ি থাকবে।
রিওয়ালক

32

পাইপিং আপনার বন্ধু ...

grep -A1কোনও ম্যাচের পরে পরবর্তী লাইনটি দেখানোর জন্য ব্যবহার করুন , তারপরে ফলাফলটি পাইপ করুন tailএবং কেবল 1 লাইন দখল করুন,

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

1
যদি "টার্ম" শেষ লাইনে থাকে, এটি কিছুই না করে "টার্ম" সম্বলিত লাইনটি ফিরিয়ে দেবে, আপনি কী চান।
অননিম

লেজু -1 1 সম্পূর্ণ ফাইলের শেষ লাইন ফলাফল করবে
সেবাস্তিয়ান

13

রিমের দুর্দান্ত উত্তর, আমার জন্য খুব দরকারী useful প্যাটার্নের পরে যেমন লাইন 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

সাধারণভাবে, আমি আপনাকে সম্মত করছি যে আপনি এখানে প্রচুর গ্রেপ জিজ্ঞাসা করছেন এবং অন্য কোনও সরঞ্জামটি এর চেয়ে ভাল সমাধান হতে পারে। তবে এম্বেড থাকা পরিবেশে, আমি এটি করতে 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

গ্রিপ দিয়ে এটি করার কোনও উপায় আমি জানি না, তবে একই ফলাফলটি অর্জন করতে বিশ্রী ব্যবহার করা সম্ভব:

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

@jww কোন পার্থক্য নেই। আপনি যেমন টাইমস্ট্যাম্পগুলি থেকে দেখতে পারেন যা কয়েক মিনিট দূরে রয়েছে, মনে হয় একই সময় আমি প্রায় উত্তর দিয়েছি।
raimue

4

পার্ল ওয়ান-লাইনার সতর্কতা

কেবল মজাদার জন্য ... ম্যাচের পরে কেবল একটি লাইন মুদ্রণ করুন

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

আরও মজাদার ... ম্যাচের পরের দশটি লাইন মুদ্রণ করুন

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

কিন্ডা প্রতারণা যদিও আসলে দুটি কমান্ড আছে


আপনি কি পরবর্তী explain। == explain ব্যাখ্যা করতে পারেন? স্পষ্টতই এটি পরবর্তী লাইন নম্বরটির সাথে পরবর্তী with এর সাথে সংখ্যার তুলনা করার চেয়ে বেশি, তবে এটি কীভাবে / কেন কাজ করে তা আমি বুঝতে পারি না।
কিথ বেনট্রপ

এটি এর চেয়ে বেশি কিছু নয়। $. == $next && printএর মতোইprint if $. == $next
16:

আহ, আমি এখন দেখতে। ধন্যবাদ! 2 অংশগুলির মধ্যে প্রতিটি সত্য এবং লুপের পৃথক, সংলগ্ন পুনরাবৃত্তির উপর কার্যকর করে। আমি মনে করি যদি বিন্দুটি কোনও মিলের পরে কোনও লাইন মুদ্রণ করে যা আপনি ক্রমটি বিপরীত করতে চান (আরও ভাল আচরণ করবে grep -A1)। আপনি যদি কেবল পরবর্তী লাইনগুলি মুদ্রণ করতে চান তবে কখনও কোনও মিলের সাথে একটি লাইন না থাকে তবে আপনি এটি এই আদেশটি রাখবেন। (ঠিক বুঝেই কিভাবে $ পরবর্তী পরপর মিলের জন্য clobbered হবে)
কিথ Bentrup

3

দেখে মনে হচ্ছে আপনি সেখানে ভুল সরঞ্জামটি ব্যবহার করছেন। গ্রেপ এত পরিশীলিত নয়, আমি মনে করি আপনি কাজের জন্য হাতিয়ার হিসাবে বিশ্রী পদক্ষেপ নিতে চান:

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

আপনি যদি কোনও সমস্যা পান তবে আমাকে জানান, আমি মনে করি এটি বেশ কয়েকটি বিশৃঙ্খলা শেখার পক্ষে উপযুক্ত, এটি একটি দুর্দান্ত সরঞ্জাম :)

PS এই উদাহরণটি 'বিড়াল পুরষ্কারের অকেজো ব্যবহার' জিততে পারে না;) http://porkmail.org/era/unix/award.html


3
বিটিডাব্লু, আপনি প্রিন্টে "$ 0" এড়িয়ে যেতে পারেন।
মিশা łরাজের

0

গ্রেপ / প্যাটার্ন / | লেজ -n 2 | মাথা -n 1

প্রথমে টেইল 2 এবং তারপরে ম্যাচের পরে ঠিক প্রথম লাইনটি পেতে শেষের দিকে যান।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.