কারণ কেন
tac file | grep foo | head -n 1
প্রথম ম্যাচে থামছে না বাফারিংয়ের কারণে।
সাধারণত, head -n 1
একটি লাইন পড়ার পরে প্রস্থান করে। সুতরাং grep
এটির দ্বিতীয় লাইনটি লেখার সাথে সাথে একটি সিগপাইপ পাওয়া এবং প্রস্থান করা উচিত।
তবে যা হয় তা হ'ল কারণ এর আউটপুট কোনও টার্মিনালে যাচ্ছে না, grep
এটি বাফার করে। এটি, এটি যথেষ্ট পরিমাণে জমে না হওয়া পর্যন্ত এটি লিখছে না (জিএনইউ গ্রেপ সহ আমার পরীক্ষায় 4096 বাইট)।
এর অর্থ কী grep
এটি 8192 বাইট ডেটা লিখে দেওয়ার আগে প্রস্থান করবে না, সম্ভবত বেশ কয়েকটি লাইন।
জিএনইউ দিয়ে grep
আপনি এটি ব্যবহার করে তাড়াতাড়ি প্রস্থান --line-buffered
করতে পারবেন যা টার্মিনালে যায় কিনা তা নির্বিশেষে পাওয়া যায় তবেই এটি লাইন লিখতে বলে lines সুতরাং grep
এটি খুঁজে দ্বিতীয় লাইনে প্রস্থান করবে।
তবে জিএনইউর সাথে grep
যাইহোক, আপনি এর -m 1
পরিবর্তে @ টেরডন দেখিয়ে ব্যবহার করতে পারেন , এটি প্রথম ম্যাচে প্রস্থান হওয়ার সাথে সাথে আরও ভাল।
যদি আপনার grep
জিএনইউ না হয় grep
তবে আপনি তার পরিবর্তে sed
বা ব্যবহার করতে পারেন awk
। তবে tac
জিএনইউ কমান্ড হওয়ার কারণে আমি সন্দেহ করি যে আপনি এমন একটি সিস্টেম পাবেন tac
যেখানে grep
জিএনইউ নেই grep
।
tac file | sed "/$pattern/!d;q" # BRE
tac file | P=$pattern awk '$0 ~ ENVIRON["P"] {print; exit}' # ERE
কিছু সিস্টেমকে tail -r
জিএনইউর মতো কাজ করতে tac
হয়।
দ্রষ্টব্য, নিয়মিত (সন্ধানযোগ্য) ফাইলগুলির জন্য tac
এবং tail -r
দক্ষ কারণ তারা ফাইলগুলি পিছিয়ে পড়ে, তারা কেবল ফাইলটিকে পিছনে ছাপানোর আগে মেমরিতে পুরোপুরি পড়ছে না ( @ স্ল্যামের সিড পদ্ধতির হিসাবে বা tac
নিয়মিত নয় এমন ফাইলগুলিতে) ।
যেসব সিস্টেমে tac
নাও tail -r
উপলভ্য নয়, কেবলমাত্র বিকল্পগুলি হ'ল ব্যাকগ্রাউন্ড-রিডিংটি প্রোগ্রামিং ভাষা perl
বা ব্যবহারের মতো ভাষা দিয়ে হাতে প্রয়োগ করা হবে:
grep -e "$pattern" file | tail -n1
বা:
sed "/$pattern/h;$!d;g" file
তবে এর অর্থ সমস্ত ম্যাচ সন্ধান করা এবং কেবল শেষটি মুদ্রণ করা।