প্রতিটি গ্রেপের ফলাফলের পরে কীভাবে লাইনগুলি 2-4 প্রদর্শিত হবে?


39

আমি এমন একটি মেলবক্স ফাইল পার্স করছি যা ই-মেইল সার্ভারের প্রতিবেদনগুলি অসফলভাবে বিতরণ করা ইমেলটির জন্য সঞ্চয় করে। আমি খারাপ ই-মেইল ঠিকানাগুলি বের করতে চাই, যাতে আমি সেগুলি সিস্টেম থেকে সরিয়ে ফেলি। লগ ফাইলটি দেখতে এমন দেখাচ্ছে:

...some content...
                   The mail system

<slavicatomic118@hotmail.com>: host mx1.hotmail.com[65.54.188.94] said: 550
    Requested action not taken: mailbox unavailable (in reply to RCPT TO
    command)

...some content...
                   The mail system

<oki88@optimumpro.net>: host viking.optimumpro.net[79.101.51.82] said: 550
    Unknown user (in reply to RCPT TO command)

...some content...
                   The mail system

<sigirna_luka@yahoo.com>: host mta5.am0.yahoodns.net[74.6.140.64] said: 554
    delivery error: dd This user doesn't have a yahoo.com account
    (sigirna_luka@yahoo.com) [0] - mta1172.mail.sk1.yahoo.com (in reply to end
    of DATA command)

...etc.

ই-মেল ঠিকানাটি "দ্য মেল সিস্টেম" সহ একটি লাইনের পরে 2 লাইন আসে। এরকম গ্রেপ ব্যবহার করা আমাকে "দ্য মেল সিস্টেম" লাইন এবং পরবর্তী দুটি লাইন দেয়:

grep -A 2 "The mail system" mbox_file

তবে এই আউটপুট থেকে কীভাবে "দ্য মেল সিস্টেম" লাইন এবং দ্বিতীয় খালি লাইনটি সরিয়ে ফেলতে হয় তা আমি জানি না। আমি অনুমান করি যে এটি করার জন্য আমি পিএইচপি / পার্ল / পাইথন স্ক্রিপ্ট লিখতে পারি, তবে আমি আশ্চর্য হয়েছি যদি এটি গ্রেপ বা অন্য কোনও মানক সরঞ্জাম দিয়ে সম্ভব কিনা। আমি-বি প্যারামিটারে নেতিবাচক অফসেট দেওয়ার চেষ্টা করেছি:

grep -A 2 -B -2 "The mail system" mbox_file

তবে গ্রেপ অভিযোগ করেছেন:

grep: -2: invalid context length argument

গ্রেপ দিয়ে এটি করার কোনও উপায় আছে?


3
-বি হ'ল -A হিসাবে সংখ্যাটি গ্রহণ করে এবং ম্যাচের আগে এটি পূর্ববর্তী রেখাগুলি প্রদর্শন করবে।
নিখিল মুলি

3
হ্যাঁ, এটি সত্য, তবে মিলান ম্যাচের আগে কী হবে তার বিষয়ে আগ্রহী নন ... তিনি যে সমস্যাটির মুখোমুখি হয়েছিলেন তা হ'ল - এ এবং-বি কেবল ইতিবাচক মানগুলি গ্রহণ করে ... এবং যে কোনও ক্ষেত্রেই, -এ এবং-বি পারেন একে অপরের সাথে আপেক্ষিকভাবে ব্যবহার করা হবে না, যেমন সে চেষ্টা করার চেষ্টা করেছে।
পিটার.ও

1
হুম, কেবল এটি নিশ্চিত করার জন্য: সেগুলি হ'ল ডামি ঠিকানা যা আপনি (সরাসরি) আপনার দেওয়া ফাইল থেকে সরান নি, তাই না?
ম্যাথিউ এম।

1
@ ম্যাথিউ এম। না, তারা আসল লগ ফাইল থেকে এসেছে। এগুলি যেহেতু তারা অবৈধ ঠিকানা হ'ল আমি বুঝতে পেরেছি, ডামি ঠিকানাগুলি আবিষ্কারের মূল বিষয়টি যা বৈধ হতে পারে।
মিলান বাবুস্কভ

উত্তর:


29

এটি grepকেবলমাত্র ব্যবহার করে সমাধানের সহজ উপায় হ'ল grepশেষে আরও একটি উল্টোটি পাইপ করা । উদাহরণ স্বরূপ:

grep -A 4 "The mail system" temp.txt | grep -v "The mail system" | grep -v '^\d*$'

28

আপনি যদি ব্যবহার করতে লক না হন তবে grepচেষ্টা করুন sed...

sed -n '/The mail system/{n;n;p}' 

এটি "দ্য মেল সিস্টেম" সম্বলিত একটি লাইন খুঁজে পেলে এটি পরবর্তী লাইনে দু'বার পাঠ করে, n;n;পূর্ববর্তী লাইনটিকে যেমন করে তেমনভাবে তা ত্যাগ করে।
এটি আপনার গ্রুপের তৃতীয় লাইনটি প্যাটার্ন স্পেসে ছেড়ে দেয় যা সেডের pকমান্ডের মাধ্যমে মুদ্রিত হয় .. অগ্রণী -nবিকল্পটি সমস্ত অন্যান্য মুদ্রণ প্রতিরোধ করে।

পরের দুটি লাইন প্রিন্ট করতে, এটি কেবল পরবর্তী ঘটনা এবং n;p আরও দু'বার মুদ্রণ করা।

sed -n '/The mail system/{n; n;p; n;p; n;p}'   

পরবর্তী লাইনটি আপনার প্রয়োজনীয় রেখাগুলির জন্য পড়ে কেবলমাত্র একটি দিয়ে আ সিঙ্গল ব্লকটি জমা করা এবং মুদ্রণ করা যায় p... Nপরবর্তী লাইনটি পড়ে এবং এটি প্যাটার্ন স্পেসে সংযুক্ত করে,

এখানে চূড়ান্ত কনডেন্সড সংস্করণ ...

sed -n '/The mail system/{n;n;N;N;p}'   

আপনি যদি গ্রিপ ওয়াল্ড আউটপুটটির অনুরূপ কোনও গ্রুপ সেপারেটর চান তবে আপনি সেডের সন্নিবেশ কমান্ডটি i(যা কোনও লাইনের শেষ কমান্ড হতে হবে) ব্যবহার করতে পারেন ...

একটি গ্রুপ বিভাগকে অন্তর্ভুক্ত করার জন্য সিনট্যাক্সটি এখানে

sed -n '/The mail system/{n;n;N;N;p;i--
       }' > output-file  # or | ...

প্রথম ম্যাচের জন্য এখানে আউটপুট দেওয়া হচ্ছে:

<slavicatomic118@hotmail.com>: host mx1.hotmail.com[65.54.188.94] said: 550
    Requested action not taken: mailbox unavailable (in reply to RCPT TO
    command)                                                                    
--

+1 টি। ধন্যবাদ। এই ক্ষেত্রে আমার এটির দরকার নেই, তবে আমি যদি আরও জটিল জিনিসগুলি হ্যান্ডেল করতে পারি তবে আমি এই বুকমার্কটি রাখব।
মিলান বাবুস্কভ

এটি একটি দুর্দান্ত উত্তর!
ডটানকোহেন

9
grep -A 2 -B -2 "The mail system" mbox_file

-B পূর্ববর্তী লাইনের জন্য, সুতরাং -নেগিটিভ মান দেওয়ার প্রয়োজন নেই।

grep -A 2 -B 2 "The mail system" mbox_file   # This will work please check

এটি প্রশ্নের উত্তর দেয় না। -A 2 -B 2প্রসঙ্গের আগে দুটি লাইন থেকে প্রসঙ্গের পরে 2 লাইনে মুদ্রণ করা হয়। প্রশ্নটি প্রসঙ্গের পরে 2 লাইন থেকে প্রসঙ্গের পরে 4 লাইনে মুদ্রণের বিষয়ে।
daniel.neumann

1

আমি কেবল গ্রিপ (গুলি) ব্যবহার করার কোনও অর্থ দেখছি না, যদি তা কঠোর সীমাবদ্ধ থাকে। এটি গ্রেপ টু কল দিয়ে করা যায় না।

grep -A 2 "The mail system" mbox_file | tail -n +3
  • গ্রেপ: পরে লাইন এবং আউটপুট 2 লাইন সন্ধান করুন,
  • লেজ: প্রথম 2 লাইন কাটা (অর্থাত্ তৃতীয় লাইন থেকে শুরু)।

2
এটি কেবল তখনই কাজ করে যদি কোনও একক ম্যাচিং লাইন থাকে, যা সম্ভবত প্রশ্নটি জিজ্ঞাসা করছে না।
jw013

প্রশ্নটি যা চেয়েছিল তা কিছুই নয় তবে এটি আমার বর্তমান পরিস্থিতিতে আমাকে সহায়তা করে :-)।
daniel.neumann

1
@ ড্যানিয়েল.নুমান আমি জানি, তবে আমি ঠিক আপনার জুতোতে ছিলাম এবং ভেবেছিলাম অন্যের গুগল-ফু এখানেও নেতৃত্ব দেবে।
TWiStErRob

0

এটি পার্ল ব্যবহার করে, রেজিএক্সএক্স ম্যাচের পরে পরবর্তী 1 লাইনটি মুদ্রণ করে

perl -ne 'print if( (/The mail system/ && ($end=1))..!$end-- )' 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.