'গ্রেপ-কিউ' পুরো ইনপুট ফাইলটি গ্রাহ্য করে কেন?


23

নিম্নলিখিত ইনপুট ফাইলটি বিবেচনা করুন:

1
2
3
4

চলমান

{ grep -q 2; cat; } < infile

কিছু মুদ্রণ করে না। আমি এটি মুদ্রণ আশা করি

3
4

আমি যদি এটিকে পরিবর্তন করি তবে আমি প্রত্যাশিত আউটপুট পেতে পারি

{ sed -n 2q; cat; } < infile

কেন প্রথম কমান্ড প্রত্যাশিত আউটপুট মুদ্রণ করে না?
এটা একটা seekable ইনপুট ফাইল এবং প্রতি এর মান অধীনে বিকল্প :

-q
      Quiet. Nothing shall be written to the standard output, regardless of 
      matching lines. Exit with zero status if an input line is selected.

এবং আরও নীচে, অ্যাপ্লিকেশন ব্যবহারের অধীনে (খনিতে জোর দিন):

-qবিকল্প সহজে নির্ণয় করা হোক বা না হোক একটি প্যাটার্ন (বা স্ট্রিং) ফাইল একটি গ্রুপ বিদ্যমান একটি উপায় প্রদান করে। বেশ কয়েকটি ফাইল অনুসন্ধান করার সময় এটি একটি পারফরম্যান্স উন্নতি সরবরাহ করে ( কারণ এটি প্রথম ম্যাচটি খুঁজে পাওয়ার সাথে সাথে এটি প্রস্থান করতে পারে ) [...]

এখন, একই মান অনুযায়ী (ইন ভূমিকা অধীন ইনপুট ফাইল )

যখন কোনও স্ট্যান্ডার্ড ইউটিলিটি একটি সন্ধানযোগ্য ইনপুট ফাইলটি পড়ে এবং ফাইলের শেষের দিকে পৌঁছানোর আগে কোনও ত্রুটি ছাড়াই শেষ হয়, ইউটিলিটি নিশ্চিত করবে যে ওপেন ফাইলের বিবরণে ফাইলটি অফসেটটি যথাযথভাবে ইউটিলিটি দ্বারা প্রসেস করা শেষ বাইটের ঠিক পরে রয়েছে [ ..]

tail -n +2 file
(sed -n 1q; cat) < file
...

দ্বিতীয় কমান্ডটি কেবল তখনই ফাইলটির সন্ধানের ক্ষেত্রে সমান।


কেন grep -qপুরো ফাইলটি গ্রাস করে?


এটি gnu grepযদি গুরুত্বপূর্ণ হয় (যদিও কুসালানন্দ কেবল ওপেনবিএসডি তে একই ঘটনা ঘটেছে তা নিশ্চিত করেছেন)


OpenBSD এর grepকিছু বলা একটি কাঁটাচামচ হয় FreeGrep , কেউ যদি বিস্ময়ের।
কুসালানন্দ

উত্তর:


37

grep তাড়াতাড়ি থামবে না, তবে এটি এর ইনপুটটিকে বাফার করে যাতে আপনার পরীক্ষাটি খুব সংক্ষিপ্ত হয় (এবং হ্যাঁ, আমি বুঝতে পারি যে আমার পরীক্ষাটি অসম্পূর্ণ, কারণ এটি অন্বেষণযোগ্য নয়):

seq 1 10000 | (grep -q 2; cat)

আমার সিস্টেমে 6776 এ শুরু হয়। এটি জিএনইউ গ্রেপে ডিফল্টরূপে ব্যবহৃত 32KiB বাফারের সাথে মেলে :

seq 1 6775 | wc

আউটপুট

   6775    6775   32768

নোট করুন যে পসিক্স কেবল কর্মক্ষমতা উন্নতির কথা বলে ments

বেশ কয়েকটি ফাইল অনুসন্ধান করার সময়

একটি একক ফাইল আংশিকভাবে পড়ার কারণে পারফরম্যান্স উন্নতির জন্য এটি কোনও প্রত্যাশা সেট করে না।


2

এটি স্পষ্টতই বাফারিংয়ের কারণে যা grepজিনিসের গতি বাড়ায় । এমন সরঞ্জাম রয়েছে যা বিশেষত অনুরোধ হিসাবে অনেকগুলি অক্ষর পড়ার জন্য ডিজাইন করা হয়েছে এবং আরও কিছু নয়। এর মধ্যে একটি হ'ল expect:

{ expect -c "log_user 0; expect 2"; cat; } < infile

এটি চেষ্টা করার মতো ব্যবস্থা আমার কাছে নেই, তবে আমি বিশ্বাস করি যে expectএটি প্রত্যাশিত স্ট্রিং ( 2) এর মুখোমুখি না হওয়া অবধি সমস্ত কিছু খেয়ে ফেলবে এবং তারপরে বাকি ইনপুটটি রেখে দিয়ে সমাপ্ত হবে cat


1

আপনি বিভ্রান্ত করছেন সেড এবং গ্রেপ।

সেড কমান্ডের জন্য, -2qবর্তমান পুনরাবৃত্তিটি ছেড়ে দেওয়ার কথা বলছে যদি দ্বিতীয় লাইনে, -nবিকল্পটি নিঃশব্দে কাজ করতে বলে, তাই আপনি ২ য় পরে সমস্ত লাইন পাবেন।

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

if grep -q 'crash' <somelog.log ; then report_crash_via_email ; fi

এক্ষেত্রে আমরা সমস্ত মিলে যাওয়া লাইন দেখতে সত্যিই যত্নশীল হই না, কমপক্ষে একটি উপস্থিত থাকলে আমরা কেবল যত্নশীল। report_crash_via_emailপ্রক্রিয়া / ফাংশন তারপর বন্ধ হয়ে যেতে পারে এবং ফাইলটি পুনরায় খুলুন, বা না।

যদি আপনি "2" চরিত্রটি খুঁজে পাওয়ার পরে আপনার গ্রেপ প্রক্রিয়াটি থামাতে চান - এটি ডিফল্টরূপে হবে না, এটি প্রতিটি লাইন মিলছে কিনা তা দেখার জন্য এটি পরীক্ষা করবে - এটি করার জন্য আপনাকে এটি বলার প্রয়োজন। কমান্ড লাইন সুইচ এটি -m <value>। সুতরাং আপনার ক্ষেত্রে grep -q -m1 2,।


6
আপনার উত্তরটি সাধারণ ব্যবহারের জন্য দরকারী তথ্য grepতবে এই প্রশ্নটি আরও সূক্ষ্ম এবং রহস্যজনক কিছু সম্পর্কে জিজ্ঞাসা করছে। দেখে মনে হচ্ছে আসল আচরণটি জিজ্ঞাসা করা হয়েছে তা বুঝতে আপনি খুব দ্রুত প্রশ্নটি পড়েছেন। এছাড়াও, জিএনইউ অনুসন্ধান করা বন্ধ grep করে দেয় -q(পসিক্স স্পেসিফিকেশনের উদ্ধৃতি অনুসারে): জিএনইউ গ্রেপের ম্যান পেজটিতে বলা হয়েছে যে "কোনও মিল পাওয়া গেলে অবিলম্বে শূন্য স্থিতি সহ প্রস্থান করুন [গুলি]" । এফডাব্লুআইডাব্লু, আপনি কীভাবে ভবিষ্যতের পোস্টগুলি ফর্ম্যাট করতে পারবেন তা দেখানোর জন্য আমি আপনার প্রশ্নটি সম্পাদনা করেছি। স্ট্যাক এক্সচেঞ্জ থেকে ওয়েলকম ।
অ্যান্টনি জি - মনিকার পক্ষে ন্যায়বিচার

এটি বলেছিল, @ ব্যবহারকারীর 1212377 এর উত্তর সঠিক: এই উদাহরণে grepযদি জিজ্ঞাসা করা হয় যে '2' ফাইলটিতে আছে কি না, এর চেয়ে বেশি কিছুই এবং কিছু কম নয়। এটি সেই বিন্দু পর্যন্ত রেকর্ডগুলির মতো আচরণ করে নাsed এবং গ্রাহ্য করে না এবং আরও প্রক্রিয়াজাতকরণের জন্য অবশিষ্টটি ছেড়ে যায়। এটি '2' রয়েছে বা এটি না থাকা পর্যন্ত ফাইলটি বন্ধ করে দেয় এবং ফলাফলটি না ফেরানো পর্যন্ত এটি পড়ে।
কিথ ডেভিস

grepপ্রকৃতপক্ষে কেবলমাত্র 'সম্পূর্ণ ফাইলটি গ্রাস করে' (বাফারিং বিবেচনা উপেক্ষা করে) যদি অনুসন্ধানের স্ট্রিং ফাইলটিতে উপস্থিত না থাকে (যা কেবলমাত্র পুরো ফাইলটি পরীক্ষা করে প্রমাণযোগ্য)। যে কিছুই যে কম, ফাইল পড়া বন্ধ , ফাইল বন্ধ, এবং ব্যর্থতা ফিরে।
কিথ ডেভিস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.