কোনও ফাইলের পাঠ্যের জন্য কীভাবে গ্রেপ করবেন এবং যে অনুচ্ছেদে পাঠ্য রয়েছে তা প্রদর্শন করবেন?


24

নীচে ফাইলটিতে লেখা রয়েছে:

Pseudo name=Apple
Code=42B
state=fault

Pseudo name=Prance
Code=43B
state=good

আমাকে "42 বি" এর জন্য গ্রেপ করতে হবে এবং উপরের পাঠ্যটি থেকে আউটপুট পাওয়া যেমন:

Pseudo name=Apple
Code=42B
state=fault

grep/ awk/ ব্যবহার করে কীভাবে এটি অর্জন করবেন সে সম্পর্কে কারও ধারণা আছে sed?


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

উত্তর:


38

সঙ্গে awk

awk -v RS='' '/42B/' file

RS=ইনপুট রেকর্ড পৃথককে একটি নতুন লাইন থেকে ফাঁকা রেখায় পরিবর্তন করে। কোনও রেকর্ডের কোনও ক্ষেত্রে যদি রেকর্ডটি /42B/মুদ্রণ করে।

''(নাল স্ট্রিং) হ'ল একটি ম্যাজিক মান যা পসিক্স অনুসারে ফাঁকা রেখা উপস্থাপন করতে ব্যবহৃত হয় :

তাহলে আরএস নাল হয়, তাহলে রেকর্ড একটি গঠিত সিকোয়েন্স দ্বারা বিভক্ত করা হয় <newline>প্লাস এক বা একাধিক ফাঁকা লাইন, বিশিষ্ট বা লম্বা ফাঁকা রেখা শুরুতে বা ইনপুট শেষে খালি রেকর্ড স্থাপিত করবে না, এবং একটি <newline>সবসময় একটি ক্ষেত্র বিভাজক থাকবে এফএসের মান কী তা নয় ।

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

awk -v RS='' -v ORS='\n\n' '/42B/' file

1
একটি মার্জিত সমাধানের জন্য +1। আপনাকে ফাইলটি পুনঃনির্দেশ করার দরকার নেই ...
জেসনওয়ারিয়ান

আঙুলগুলি অটোপাইলটে ছিল।
লুয়া

2
@ জেসনওয়ারিয়ান, যদি না আপনার awk ( FILENAME) এর মধ্যে ফাইলের নামের অ্যাক্সেসের প্রয়োজন হয়, তবে পুনর্নির্দেশটি ব্যবহার করা খারাপ ধারণা নয় কারণ এটি ফাইল নামটির জন্য সমস্যাগুলি এড়ানো =বা -(বা হওয়া -) শুরু করে, ধারাবাহিক ত্রুটি বার্তাগুলি তৈরি করে এবং চলমান awkবা সঞ্চালন এড়ায় ইনপুট ফাইলটি খুলতে না পারলে অন্যান্য পুনর্নির্দেশগুলি।
স্টাফেন চেজেলাস

14

ধরে নিই ডেটাটি এমনভাবে কাঠামোযুক্ত হয়েছে যাতে এটি ম্যাচের আগে 1 লাইন এবং তার পরে 1 লাইন অন্তর্ভুক্ত করার জন্য গ্রিপ -A(পরে) এবং -B(আগে) স্যুইচগুলি ব্যবহার করতে পারেন তার আগে এবং পরে সর্বদা লাইনটি আপনি চান :

$ grep -A 1 -B 1 "42B" sample.txt
Pseudo name=Apple
Code=42B
state=fault

আপনি যদি অনুসন্ধান শব্দটির আগে এবং পরে একই সংখ্যার লাইনগুলি চান তবে আপনি -C(প্রসঙ্গ) স্যুইচটি ব্যবহার করতে পারেন :

$ grep -C 1 "42B" sample.txt
Pseudo name=Apple
Code=42B
state=fault

আপনি যদি একাধিক লাইনের সাথে pcregrepকোনও প্যাটার্নটি মেলে একাধিক লাইনের সাথে মেলে আপনি আরও কড়া হতে চান :

$ pcregrep -M 'Pseudo.*\n.*42B.*\nstate.*' sample.txt
Pseudo name=Apple
Code=42B
state=fault

উপরোক্ত প্যাটার্নটি নিম্নলিখিত অনুসারে মেলে:

  • -M - একাধিক লাইন
  • 'Pseudo.*\n.*42B.*\nstate.*'- স্ট্রিংয়ের একটি গ্রুপের সাথে মেলে যেখানে প্রথম স্ট্রিংটি শুরু হয় শব্দের সাথে শুরু "Pseudo"করে কোনও অক্ষর রেখার শেষ অবধি \n, তারপরে স্ট্রিং অবধি "42B"কোনও অক্ষর অবধি লাইন ( \n) এর অন্য প্রান্ত পর্যন্ত থাকে , তার পরে স্ট্রিং হয় "state"কোন অক্ষর দ্বারা অনুসরণ করা।

5
-C(প্রসঙ্গ) একটি শর্টকাট হিসাবে ব্যবহার করা যেতে পারে, যদি -Aএবং -Bএকই।
ডেভিড ব্যাগারম্যান

@ ডেভিড ব্যাগারম্যান - ধন্যবাদ উত্তরে এটি যুক্ত হয়েছে।
slm

কেন এক ডাউন ভোট? এই প্রশ্নের উত্তর।
slm

4

অ্যাডকের সাথে এটি করার সম্ভবত একইভাবে সহজ উপায় আছে তবে পার্লে:

cat file | perl -ne 'BEGIN { $/="\n\n" }; print if $_ =~ /42B/;'

এটি মূলত বলেছে যে ফাঁকা রেখাগুলি দ্বারা বিভাজনিত ফাইলগুলিকে খণ্ডগুলিতে ভাগ করা, তারপরে কেবল আপনার নিয়মিত প্রকাশের সাথে মেলে এমন খণ্ডগুলি মুদ্রণ করতে।


10
বিকল্পগুলি এবং শর্টহ্যান্ডগুলি ব্যবহার করে এবং এর অকেজো ব্যবহারcat হারাতে এটি সরল করা যেতে পারে ; perl -00 -ne 'print if /42B/' file
ট্রিপলি

4

grepইউনিক্স কিছু স্বাদে আছে -p"অনুচ্ছেদ" জন্য পতাকা। আমি জানি এআইএক্স করে

grep -p 42B <myfile>

আপনি সেখানে যা চাইছেন ঠিক তাই করবে। ওয়াইএমএমভি এবং জিএনইউ গ্রেপের এই পতাকা নেই।


-P পতাকা থাকা দুর্দান্ত হবে। বিশেষত যদি -v এর সাথে একত্রে ব্যবহৃত হয় যাতে আপনি আউটপুট থেকে পুরো অনুচ্ছেদগুলি বাদ দিতে পারেন।
IllvilJa

2

একটি অন্য পারল সমাধান, ট্র্যাকিং ফাঁকা লাইন ছাড়াই:

perl -00ne 'if ($_ =~ /42B/) {chomp($_); printf "%s\n",$_}' foo

উদাহরণ

% perl -00ne 'if ($_ =~ /42B/) {chomp($_); printf "%s\n",$_}' foo
Pseudo name=Apple
Code=42B
state=fault

% cat foo
Pseudo name=Apple
Code=42B
state=fault

Pseudo name=Prance
Code=43B
state=good

1
অথবা খাটো (এবং এইভাবে আরো পাঠযোগ্য), কারণ যে triplee একটি মন্তব্যে লিখেছিলেন: perl -00 -ne 'print if /42B/' file
mivk
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.