ম্যাচের আগে এবং পরে Nth এবং Mth লাইনগুলি ফিরতে গ্রেপ


12

আমি জানি যে গ্রেপ দিয়ে আমি ক্ষেত্রগুলি ব্যবহার করতে পারি -Aএবং -Bকোনও ম্যাচ থেকে পূর্ব এবং পরবর্তী লাইনগুলি টানতে পারি।

তবে তারা ম্যাচের মধ্যে সমস্ত লাইন টানছে তবে অনেকগুলি লাইন নির্দিষ্ট করা আছে তার ভিত্তিতে।

grep -r -i -B 5 -A 5 "match" 

আমি মাত্র 5 পেতে চান তম ম্যাচ সামনে লাইন ও 5 মিলেছে লাইন ছাড়াও খেলা শেষে লাইন এবং মধ্যে লাইন না পেতে।

এর সাথে কি করার উপায় আছে grep?


1
আপনি এটি সেড মধ্যে পাইপ দ্বারা এটি করতে পারে। আমি কেবল এটি পরীক্ষা করেছি এবং এটি কাজ করেছে, তবে এটি কেবল তখনই কাজ করেছিল যখন ফাইলে 1 টি সঠিক মিল ছিল: grep -r -i -B 5 -A 5 "match" | sed -e 1b -e '$!d'
টেরেন্স

@ টার্নেন্স আপনাকে এই পরামর্শের জন্য ধন্যবাদ, যেহেতু আমি উল্লেখ করেছি যেহেতু আমি 1000 লাইন সংগ্রহ করছি এটি কাজ করবে না।
চোলিদা

আমি ভাবি না যে
গ্রেপ

সমস্যা নেই! আপনি কি উত্তর পেতে আগ্রহী ধরনের। =)
টেরেন্স

এটি কি এক ফাইলে বা একাধিক ফাইলে রয়েছে?
জোশুয়া বেসিনিটি

উত্তর:


1

আপনি যে সরঞ্জামটি ব্যবহার করতে চান তাকে সিফট বলা হয়। এটি মূলত স্টেরয়েডগুলির উপর একটি গ্রেপ। সমান্তরালে গ্রেপ। আপনি যা চান ঠিক তা করতে সিফ্টের প্রচুর পরিমাণে বিকল্প রয়েছে - বিশেষত কোনও ম্যাচ (গুলি) এর সাথে সম্পর্কিত কোনও নির্দিষ্ট লাইনটি ফেরত পাঠানো / যা কিছু পাঠ্যপুস্তক দ্বারা অনুসরণ করা / নাও হতে পারে।

এটি আমাকে অবাক করে দেয় যে গোপনীয় ভাষায় লিখিতভাবে লিখিতভাবে লিনাক্সে ইনস্টল করা হওয়ায় মূল প্রবাহের gnu নয়, এটি মূল প্রবাহের gnu নয়। আইটি সমান্তরালভাবে সমস্ত সিপাস বিপুল পরিমাণে পাঠ্য ব্যবহার করে সন্ধান করে যেখানে গ্রেপ এটি করতে কয়েক সপ্তাহ নেয়।

ওয়েবসাইট নির্বাচন করুন - উদাহরণ দেখুন


আস্কউবুন্টুতে স্বাগতম, উত্তর দেওয়ার জন্য ধন্যবাদ। আপনাকে এমন একটি সিআইএল উদাহরণ সরবরাহ করতে হবে যা ওয়েবসাইটের একটি লিঙ্ক সরবরাহ করার চেয়ে এই নির্দিষ্ট সমস্যাটিকে সমাধান করতে পারে। এটি পুরোপুরি একটি প্রশ্নোত্তর, ধন্যবাদ।
বার্নার্ড ওয়েই

12

এমন:

cat file
a
b
c
d
e
f match
g
h
i match
j
k
l
m
n
o

তারপর:

awk '
    {line[NR] = $0} 
    /match/ {matched[NR]} 
    END {
        for (nr in matched)
            for (n=nr-5; n<=nr+5; n+=5) 
                print line[n]
    }
' file
a
f match
k
d
i match
n

+1, তবে আপনি এর শব্দার্থক ব্যাখ্যা করতে পারেন /match/ {matched[NR]}? আমি সম্পূর্ণ কমান্ড হিসাবে আরে বা পরিবর্তনশীলটি কখনও দেখিনি। এটি কি অ্যারের সাথে প্রতিটি মিলিত লাইনের বর্তমান রেকর্ড নম্বরটি দিচ্ছে?
জো

এটি একটি অদ্ভুত বিজোড়তা: আপনি যদি বিনা বরাদ্দ ছাড়াই একটি অ্যারে উপাদান উল্লেখ করেন তবে সেই কীটি অ্যারেতে যুক্ত হবে (কোনও মান ছাড়াই)। তারপরে সেই কীটি এক্সপ্রেশনটিতে প্রদর্শিত হবে key in array। আমি যা করছি তা লাইন নম্বরগুলি স্মরণ করা যেখানে প্যাটার্নটি উপস্থিত হয়
গ্লেন জ্যাকম্যান

6

এটি মূলত গ্লেনের সমাধান, তবে ব্যাশ, গ্রেপ এবং সেড দিয়ে প্রয়োগ করা হয়েছে।

grep -n match file |
    while IFS=: read nr _; do
        sed -ns "$((nr-5))p; $((nr))p; $((nr+5))p" file
    done

নোট করুন যে 1 এর চেয়ে কম লাইন সংখ্যাগুলি ত্রুটি করবে এবং ফাইলের লাইন সংখ্যার চেয়ে লাইন সংখ্যাগুলি এটিকে কিছুই মুদ্রণ করে তুলবে।

এটি খালি সর্বনিম্ন। এটি পুনরাবৃত্তভাবে কাজ করতে এবং উপরের লাইন নম্বর কেসগুলি হ্যান্ডেল করতে কিছু করতে হবে।


6

এটি শুধুমাত্র দিয়ে করা যায় না grep। যদি edকোনও বিকল্প হয়:

ed -s file << 'EOF' 
g/match/-5p\
+5p\
+5p
EOF  

স্ক্রিপ্টটি মূলত বলেছে: / ম্যাচ / প্রতি ম্যাচের জন্য লাইনটি তার আগে 5 টি লাইন প্রিন্ট করুন, তারপরে 5 লাইন, তারপরে 5 লাইন প্রিন্ট করুন।


5
@ বাবাশু আপনি কী ভাবেন যে ওপিকে একটি সহজ ফ্ল্যাট "এটি গ্রেপ দিয়ে করা যায় না" দেওয়ার জন্য আরও সহায়ক হবে? আমি ওপির সমস্যা সমাধানের একটি ভাল বিকল্প বলে বিশ্বাস করি তা সরবরাহ করছি। সহায়তা কেন্দ্র থেকে: "কী, বিশেষতঃ প্রশ্নটি জিজ্ঞাসা করছে? আপনার উত্তরটি এটি প্রদান করে তা নিশ্চিত করুন - বা একটি কার্যকর বিকল্প The । "
জোল

edহয় সবসময় কারণ একটি উত্তর, edমানক পাঠ্য সম্পাদক।
মিষ্টান্ন

5
@ বাবাশু এর grepউত্তর না হলেও , "আপনি এক্স দিয়ে এটি করতে পারবেন না, তবে আপনি ওয়াইয়ের সাথে এটি করতে পারেন, এখানে কীভাবে" এটি এখনও একটি বৈধ উত্তর, যেহেতু আপনি কেবল ওপির প্রশ্নের উত্তরই দেন না তবে আপনি বিকল্পও সরবরাহ করেন যে কাজ করবে। এটি এখানে একটি বৈধ প্রকারের উত্তর।
টমাস ওয়ার্ড

5
awk '/match/{system("sed -n \"" NR-5 "p;" NR "p;" NR+5 "p\" " FILENAME)}' infile

এখানে আমরা ব্যবহার করছেন awk 'র ফাংশন বহিরাগত ডাকতে লাইন যা প্রিন্ট করতে কমান্ড awk প্যাটার্ন সঙ্গে মিলেছে 5 আগে ও খেলা শেষে লাইন।system(command)sedmatch

বাক্য গঠনটি সহজ, আপনার কেবলমাত্র বাহ্যিক কমান্ডটি ডাবল-কোটের পাশাপাশি তার সুইচগুলির মধ্যে awkরাখতে হবে এবং যে জিনিসটি আপনি ঠিক কমান্ডের কাছে যেতে চান তা এড়াতে হবে, নিজেই অপশনগুলির সাথে সম্পর্কিত সমস্ত কিছুই উদ্ধৃতিগুলির বাইরে থাকা উচিত। সুতরাং নীচের সেড :

"sed -n \"" NR-5 "p;" NR "p;" NR+5 "p\" " FILENAME

অনুবাদ:

sed -n "NR-5p; NRp; NR+5p" FILENAME

NRপ্যাটার্নটির সাথে মিলে এমন লাইন নম্বর matchএবং FILENAMEএটি বর্তমান প্রসেসিং ফাইলের নামটি দিয়ে যাচ্ছে awk


2

@ গ্লেনের উদাহরণ টেক্সট ফাইল ব্যবহার করে এবং পার্ক ব্যবহারের বদলে:

$ perl -n0E 'say /(.*\n)(?=(?:.*\n){4}(.*match.*\n)(?:.*\n){4}(.*\n))/g' ex

একই ফলাফল দেবে, তবে দ্রুত চালানো:

a
f match
k
d
i match
n

জোও, আপনি এলকিউ পর্যালোচনা সারিটিতে দেখিয়েছেন এবং @ ওয়াল্টিনেটর মুছে ফেলার পক্ষে ভোট দিয়েছেন, তাই পরের বারের মতো সামান্য কিছুটা আরও ভার্বোজ হোন ... ;-) এছাড়াও আপনাকে এলকিউয়ের সারি থেকে সরিয়ে আনার জন্য +1 ... : পি
ফ্যাবি

1
@ জাজোয়া নিম্নমানের পর্যালোচনা সারি। আপনার উত্তর সম্ভবত সেখানে নেওয়া হয়েছে কারণ এটি 90% কোড ছিল।
wjandrea

1
@ জাজাও 90% চিত্রটি এটির ব্যাখ্যা করার জন্য কেবল আমার উপায়। আমি জানি না আসলে হিউরিস্টিক্স কী ব্যবহৃত হয়।
wjandrea

1
মেনোস ক্যাফে, মাইক্রোসফট! @ জাজোয়া : ডি ;-): ডি
ফ্যাবি

1
@ ফ্যাবি: সেফ ক্যাফে ন্যাড ফানসিওনা: ডি - সম্ভবত এটি এলসিকিউতে প্রদর্শিত হবে (= কম কফি সারিতে)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.