কেবল প্রথম ম্যাচটি গ্রেপ করুন এবং থামুন


328

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

# grep -o -a -m 1 -h -r "Pulsanti Operietur" /path/to/directory

আয়:

Pulsanti Operietur
Pulsanti Operietur

সম্ভবত গ্রেপ এটি করার সর্বোত্তম উপায় নয়? আপনি আমাকে বলুন, অনেক ধন্যবাদ।

উত্তর:


510

-m 1মানে যে কোনও ফাইলে প্রথম ম্যাচটি ফিরুন। তবে এটি এখনও অন্য ফাইলগুলিতে অনুসন্ধান চালিয়ে যাবে। এছাড়াও, যদি একই লাইনে দুটি বা ততোধিক মিলিত হয় তবে সেগুলি সমস্ত প্রদর্শিত হবে।

আপনি head -1এই সমস্যাটি সমাধান করতে ব্যবহার করতে পারেন :

grep -o -a -m 1 -h -r "Pulsanti Operietur" /path/to/dir | head -1

প্রতিটি গ্রেপ বিকল্পের ব্যাখ্যা:

-o, --only-matching, print only the matched part of the line (instead of the entire line)
-a, --text, process a binary file as if it were text
-m 1, --max-count, stop reading a file after 1 matching line
-h, --no-filename, suppress the prefixing of file names on output
-r, --recursive, read all files under a directory recursively

অসাধারণ! ধন্যবাদ. বিটিডব্লিউ - কমান্ডে থাকা অন্যান্য সমস্ত যুক্তি কি প্রয়োজনীয়? এবং যদি আমি এটি সুযোগে পাইপ না করতে পারি (কেবলমাত্র ক্ষেত্রে)।
টিম কাম্ম

2
আমি তাদের প্রয়োজনীয় বলে মনে করি না ( -rস্পষ্টতই ব্যতীত ) তবে তাদের আঘাত করা উচিত নয় (আমি -aযদিও এটি ব্যবহার করব না )
এমভিপি

3
ঠিক আমার যা প্রয়োজন ছিল। আমার প্যাটার্নটি একই লাইনে দু'বার পাওয়া গেছে এবং এর grep -m 1কারণে উভয় দৃষ্টান্তই ফিরেছে। |head -1সমাধান!
হার্পারভিলি

6
@ ক্রিস_আর আপনি যে শেলটি চালাচ্ছেন তার উপর নির্ভুল আচরণ নির্ভর করে first প্রথম লাইনের মুখোমুখি হওয়ার সাথে সাথেই মাথাটি বেরিয়ে যাবে। মাথাটি বেরিয়ে যাওয়ার পরে এটি লেখার চেষ্টা করার পরে পরের বার গ্রেপ প্রস্থান করবে। কিছু শেল পাইপলাইনের সমস্ত উপাদান শেষ না হওয়া পর্যন্ত অপেক্ষা করবে, কিছু পাইপের শেষ প্রোগ্রামটি শেষ হওয়ার সাথে সাথে পুরো পাইপটি বন্ধ করে দেবে।
পুহলেন

1
@ 3Qn, আমি আপনার মন্তব্য বুঝতে না: first not first from result। এই উত্তরটি কোনও ফাইলের মধ্যে প্রথম মিলবে এবং স্টপগুলি। আপনি কি কি আশা করেন?
এমভিপি

31

আপনি stdbuf এর সাথে একত্রে grepফলাফলটি পাইপ করতে পারেন ।head

দ্রষ্টব্য, নবম ম্যাচের পরে থামার বিষয়টি নিশ্চিত করার জন্য, আপনাকে অবশ্যই এটির আউটপুট বাফার করবেন না stdbufতা নিশ্চিত করে ব্যবহার করতে হবে grep:

stdbuf -oL grep -rl 'pattern' * | head -n1
stdbuf -oL grep -o -a -m 1 -h -r "Pulsanti Operietur" /path/to/dir | head -n1
stdbuf -oL grep -nH -m 1 -R "django.conf.urls.defaults" * | head -n1

head1 লাইন grepগ্রহণ করার সাথে সাথেই এটি বন্ধ হয়ে যায় এবং SIGPIPEএটি পাবেন কারণ এটি যাওয়ার সময় পাইপটিতে এখনও কিছু আউটপুট দেয় head

এটি ধরে নিয়েছে যে কোনও ফাইলের নামগুলিতে নিউলাইন নেই।


আমি সংরক্ষণাগার ফাইল বৃহৎ সংখ্যায় অনুসন্ধান করতে এই সমাধান দত্তক গ্রহণ করা চেষ্টা করছি xargs: find . -name '*.gz' | xargs -I '{}' stdbuf -oL zgrep -al 'pattern' {} | head -n 1। এটি অবশ্য প্রথম ম্যাচে শেষ হবে না। কোন পরামর্শ?
DKroot

1
করবে না grep'এর --line-bufferedবিকল্প একটি অতিরিক্ত ইউটিলিটি কলিং ছাড়া ওভারহেড বাফার প্রতিরোধ?
ডেভিড

23

আমার গ্রেপ-এর মতো প্রোগ্রামটির ackএকটি -1বিকল্প রয়েছে যা প্রথম ম্যাচে যে কোনও জায়গায় পাওয়া যায়। এটি সমর্থন করে -m 1যে @ এমভিপি পাশাপাশি উল্লেখ করে। আমি এটি সেখানে রেখেছি কারণ আমি যদি জানি যে কেবলমাত্র একটি ফাইলে বিদ্যমান আমার কাছে এমন কিছু সন্ধানের জন্য উত্স কোডের একটি বৃহত বৃক্ষটি অনুসন্ধান করা হয় তবে এটি সন্ধান করা অপ্রয়োজনীয় এবং Ctrl-C এ আঘাত করতে হবে।


সুতরাং আপনি বলবেন যে এসিপি গ্রেপের চেয়ে দ্রুত? আমি স্পিড ফ্যাক্টরের সাথেও সত্যই উদ্বিগ্ন।
টিম কাম্ম

1
আপনি কী অনুসন্ধান করছেন তার উপর নির্ভর করে এস্কি গ্রেপের চেয়ে দ্রুততর হতে পারে। দয়া করে নোট করুন যে ack সোর্স কোড অনুসন্ধানের বিষয়ে। আপনি যদি সাধারণ ফাইলগুলি অনুসন্ধান করতে চান তবে এটিতে কম ভাল, কমপক্ষে ack 1.x এ is এসিসি সম্পর্কে পড়ুন এবং দেখুন এটি আপনার প্রয়োজন অনুসারে ফিট করে কিনা।
অ্যান্ডি লেস্টার

2
আমি দীর্ঘদিন ধরে আককে ব্যবহার করছি তবে সম্প্রতি সিলভার সন্ধানকারীটিতে স্যুইচ করেছি যা আমি দ্রুততর বলে মনে করি
gc

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

ওয়ার্থ উল্লেখ যে agদ্রুত হতে পারে, কিন্তু এটা না আছে -1বিকল্প যা এই ক্ষেত্রে উপকারী
jja

3

আপনি যে ডিরেক্টরিটি অনুসন্ধান করছেন সেখানে নির্দিষ্ট শব্দটির উপস্থিতি যদি আপনি পুরো লাইন এবং ফাইলের নাম মুদ্রণ করতে চান তবে আপনি নীচের কমান্ডটি ব্যবহার করতে পারেন।

grep -m 1 -r "Not caching" * | head -1

2

একটি একক লাইনার, ব্যবহার করে find:

find -type f -exec grep -lm1 "PATTERN" {} \; -a -quit

6
এটি খুব ধীর হতে চলেছে , কারণ খুঁজে পাওয়া প্রতিটি ফাইলের জন্য গ্রেপের অনুলিপি তৈরি হবে। grep -rঅনেক দ্রুত কাজ করে - এটি কেবলমাত্র একটি অনুলিপি যা ডিরেক্টরি ট্র্যাভারসালগুলি করে।
এমভিপি

সত্য; যদিও অনুসন্ধানটি কেবলমাত্র পরিশোধিত ফলাফলগুলিতে পরিচালনার জন্য কাস্টমাইজ করা যেতে পারে, যা ক্যাপচার অল গ্রেপের চেয়ে অপারেশনটিকে আরও দ্রুত তৈরি করতে পারে। প্রসঙ্গে নির্ভর করে।
ইয়াম মার্কোভিচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.