অ্যাপ্লিকেশন বাগের কারণে এখনও নির্বিঘ্নিত হওয়ার কারণে আমার কাছে পুরো ডিস্ক সহ বেশ কয়েক'শ সার্ভার রয়েছে। একটি ফাইল রয়েছে যা নকল লাইনগুলিতে পূর্ণ হয়েছে - লগ ফাইল নয়, ভেরিয়েবল সংজ্ঞা সহ একটি ব্যবহারকারী পরিবেশ ফাইল (তাই আমি কেবল ফাইলটি মুছতে পারি না)।
sed
ভুলভাবে যুক্ত লাইনগুলি পরীক্ষা করতে এবং সেগুলি মোছার জন্য আমি একটি সাধারণ কমান্ড লিখেছি এবং ফাইলটির স্থানীয় অনুলিপিটিতে এটি পরীক্ষা করেছি tested এটি উদ্দেশ্য হিসাবে কাজ করে।
যাইহোক, আমি যখন এটি সম্পূর্ণ ডিস্ক সহ সার্ভারে চেষ্টা করেছি, তখন আমি প্রায় নিম্নলিখিত ত্রুটিটি পেয়েছি (এটি মেমরি থেকে, অনুলিপি এবং আটকানো নয়):
sed: couldn't flush /path/to/file/sed8923ABC: No space left on deviceServerHostname
অবশ্যই, আমি জানি যে জায়গা নেই। এজন্য আমি জিনিস মুছে ফেলার চেষ্টা করছি! ( sed
আমি যে কমান্ডটি ব্যবহার করছি তা একটি 4000+ লাইন ফাইলকে প্রায় 90 লাইনে হ্রাস করবে))
আমার sed
আদেশ ন্যায্যsed -i '/myregex/d' /path/to/file/filename
পূর্ণ ডিস্ক সত্ত্বেও আমি এই আদেশটি প্রয়োগ করতে পারি এমন কোন উপায় আছে কি?
(এটি অবশ্যই স্বয়ংক্রিয় হওয়া উচিত, যেহেতু আমাকে তাড়াতাড়ি ফিক্স হিসাবে কয়েকশত সার্ভারে প্রয়োগ করা দরকার))
(স্পষ্টতই অ্যাপ্লিকেশন বাগটি সনাক্ত করা দরকার, তবে ইতিমধ্যে সার্ভারগুলি সঠিকভাবে কাজ করছে না ....)
আপডেট: আমি যে পরিস্থিতিটির মুখোমুখি হয়েছিলাম তা মুছে ফেলাতে পারার মতো অন্য কিছু মুছে ফেলার মাধ্যমে সমাধান করা হয়েছিল তবে আমি এখনও এই প্রশ্নের উত্তর চাই যা ভবিষ্যতে এবং অন্যান্য লোকদের জন্য সহায়ক হবে।
/tmp
না-যেতে; এটি একই ফাইল সিস্টেমে on
আমি ডিস্কের স্থানটি খালি করার আগে, আমি পরীক্ষা করেছিলাম vi
এবং ফাইলটি খোলার :g/myregex/d
সাথে সাথে চালানোর মাধ্যমে আমি লাইনগুলি মুছতে পারি এবং তারপরে পরিবর্তনগুলি সফলভাবে সংরক্ষণ করতে পারি :wq
। কোনও টেম্প ফাইল রাখার জন্য পৃথক ফাইল সিস্টেমের অবলম্বন না করে এটি স্বয়ংক্রিয় করা সম্ভব হবে বলে মনে হচ্ছে .... (?)
sed -i
পরিচালনা করার জন্য একটি অস্থায়ী অনুলিপি তৈরি করে। আমি সন্দেহ করি এটির ed
জন্য এটি আরও ভাল হবে, যদিও আমি প্রকৃত সমাধানের পক্ষে যথেষ্ট ধারণা রাখি না
ed
আপনি চালাতে চাই: printf %s\\n g/myregex/d w q | ed -s infile
কিন্তু মনে রাখা কিছু বাস্তবায়নের এছাড়াও অস্থায়ী ফাইল ব্যবহার ঠিক sed
(যদি আপনি চেষ্টা করে দেখতে পারেন , busybox ইডি - আমি যতদূর জানি এটি একটি অস্থায়ী ফাইল তৈরি করে না)
echo
। ব্যবহার printf
। এবং sed
শেষ লাইনে ফেলে আসা কিছু চর সংযোজন করুন যাতে আপনি পিছনের ফাঁকা স্থানগুলি হারাতে পারেন। এছাড়াও, আপনার শেলটি একটি একক কমান্ড-লাইনে পুরো ফাইলটি পরিচালনা করতে সক্ষম হতে হবে। এটিই আপনার ঝুঁকি - প্রথমে পরীক্ষা করুন। bash
এটি বিশেষত খারাপ (আমি মনে করি এটি ডাব্লু / স্ট্যাক স্পেস করতে হবে?) এবং যে কোনও সময় আপনার উপর অসুস্থ হতে পারে। sed
প্রস্তাবিত দু'জন কমপক্ষে তাদের মধ্যে ভাল প্রভাব ফেলতে কার্নেলের পাইপ বাফারটি ব্যবহার করবে, তবে পদ্ধতিটি মোটামুটি একই। আপনার কমান্ড সাব জিনিসটি file
সেড ডাব্লু / ইন সফল কিনা তাও কেটে যাবে ।
sed '/regex/!H;$!d;x' <file|{ read v && cat >file;}
এবং যদি এটি কাজ করে তবে আমার উত্তরটি পড়ুন ''