দ্য sed
পদ্ধতির জরিমানা, কিন্তু লাইনের উপর লুপ নয়। আপনি যদি জানেন যে আপনি কতগুলি লাইন রাখতে চান (উদাহরণস্বরূপ, আমি এখানে 99 ব্যবহার করি), আপনি এটি এটি করতে পারেন:
sed -i '100,$ d' myfile.txt
ব্যাখ্যা: sed
একটি নিয়মিত এক্সপ্রেশন প্রসেসর। -i
প্রদত্ত বিকল্পের সাহায্যে এটি সরাসরি একটি ফাইল প্রক্রিয়া করে ("ইনলাইন") - কেবল এটি পড়ার পরিবর্তে এবং ফলাফলকে স্ট্যান্ডার্ড আউটপুটে লেখার পরিবর্তে। 100,$
এর অর্থ "ফাইলের শেষে 100 লাইন থেকে" - এবং কমান্ডটি অনুসরণ করা হয় d
, যা আপনি সম্ভবত "মুছুন" এর পক্ষে দাঁড়াতে সঠিকভাবে অনুমান করেছিলেন। সুতরাং সংক্ষেপে, কমান্ডটির অর্থ: "myfile.txt থেকে ফাইলের 100 লাইন থেকে সমস্ত লাইন মুছুন"। আপনি 99 লাইন রাখতে চাইলে 100 টি মুছে ফেলা প্রথম লাইন।
সম্পাদনা: পারেন, অন্য দিকে, সেখানে লগ ফাইল যেখানে আপনি যেমন রাখার বিষয়ে নিশ্চিত গত 100 লাইন:
[ $(wc -l myfile.txt) -gt 100 ] && sed -i "1,$(($(wc -l myfile.txt|awk '{print $1}') - 100)) d" myfile.txt
এখানে কি হচ্ছে:
[ $(wc -l myfile.txt) -gt 100 ]
: ফাইলটিতে 100 টিরও বেশি লাইন থাকলে কেবল নিম্নলিখিতটি করুন
$((100 - $(wc -l myfile.txt|awk '{print $1}')))
: মুছে ফেলতে লাইনের সংখ্যা গণনা করুন (অর্থাত্ ফাইলের সমস্ত রেখাগুলি (শেষ) 100 বাদে রাখতে হবে)
1, $((..)) d
: প্রথম থেকে গণনা করা লাইনের সমস্ত লাইন সরান
সম্পাদনা: যেহেতু আরও বিশদ দেওয়ার জন্য প্রশ্নটি কেবল সম্পাদিত হয়েছিল, আমি আমার উত্তরের সাথে এই অতিরিক্ত তথ্যও অন্তর্ভুক্ত করব। যুক্ত তথ্যগুলি হ'ল:
- একটি নির্দিষ্ট আকার ফাইলের সাথে থাকবে (10,000 বাইট)
- প্রতিটি লাইনের বাইটগুলিতে একটি নির্দিষ্ট আকার থাকে (উদাহরণস্বরূপ 300 বাইট)
এই ডেটা থেকে "/" হিসাবে থাকা লাইনের সংখ্যা গণনা করা সম্ভব, উদাহরণস্বরূপ 33 টি লাইন বোঝানো হবে। গণনার জন্য শেল শব্দ: $((size_to_remain / linesize))
(কমপক্ষে ব্যাশ ব্যবহার করে লিনাক্সে, ফলাফলটি পূর্ণসংখ্যা হয়)। সমন্বিত কমান্ড এখন পড়তে হবে:
# keep the start of the file (OPs question)
sed -i '34,$ d' myfile.txt
# keep the end of the file (my second example)
[ $(wc -l myfile.txt) -gt 33 ] && sed -i "1,33 d" myfile.txt
আকারগুলি আগাম হিসাবে পরিচিত হিসাবে, আর এম্বেড করা কোনও গণনার প্রয়োজন নেই sed
কমান্ডের । তবে নমনীয়তার জন্য কিছু শেল স্ক্রিপ্টের ভিতরে কেউ ভেরিয়েবল ব্যবহার করতে পারে।
ফাইলের আকারের উপর ভিত্তি করে শর্তসাপেক্ষ প্রক্রিয়াজাতকরণের জন্য, কেউ "নীচে" পরীক্ষা-কনস্ট্রাক্ট ব্যবহার করতে পারেন:
[ "$(ls -lk $file | awk ' {print $5}')" -gt 100 ] &&
যার অর্থ: "যদি আকারটি 100 $file
কেবি ছাড়িয়ে যায় তবে কর ..." (কেবিতে ls -lk
ফাইলের আকারের অবস্থান 5 অবস্থানে রয়েছে, সুতরাং awk
এটি সঠিকভাবে বের করার জন্য ব্যবহৃত হয়)।