अनुप्रयोग बग के रूप में अभी तक अनजाने में होने के कारण, मेरे पास एक पूर्ण डिस्क के साथ कई सौ सर्वर हैं। एक फ़ाइल है जो डुप्लिकेट लाइनों से भरी गई है - लॉग फ़ाइल नहीं है, लेकिन एक उपयोगकर्ता पर्यावरण फ़ाइल चर परिभाषाओं के साथ है (इसलिए मैं बस फ़ाइल को हटा नहीं सकता)।
मैंने sedत्रुटिपूर्ण रूप से जोड़ी गई लाइनों की जांच करने और उन्हें हटाने के लिए एक साधारण कमांड लिखा , और इसे फ़ाइल की एक स्थानीय प्रतिलिपि पर परीक्षण किया। यह इरादा के अनुसार काम किया।
हालाँकि, जब मैंने इसे पूरी डिस्क के साथ सर्वर पर आज़माया, तो मुझे लगभग निम्न त्रुटि हुई (यह मेमोरी से है, कॉपी और पेस्ट से नहीं):
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एक नहीं है; यह एक ही फाइल सिस्टम पर है।
इससे पहले कि मैं डिस्क स्थान को मुक्त करता, मैंने परीक्षण किया और पता लगाया कि मैं viफ़ाइल को खोलकर और चलाकर लाइनों को हटा सकता हूं :g/myregex/dऔर फिर सफलतापूर्वक परिवर्तनों को सहेज सकता हूं :wq। ऐसा लगता है कि एक अस्थायी फ़ाइल रखने के लिए एक अलग फाइल सिस्टम का सहारा लिए बिना, इसे स्वचालित करना संभव है .... (?)?
sed -iपर संचालित करने के लिए एक अस्थायी प्रतिलिपि बनाता है। मुझे संदेह है कि यह edइसके लिए बेहतर होगा, हालांकि मैं एक वास्तविक समाधान के खिलाफ मुकदमा चलाने के लिए पर्याप्त परिचित नहीं हूं
edआप चलाना चाहते हैं: printf %s\\n g/myregex/d w q | ed -s infileलेकिन ध्यान रखें कुछ कार्यान्वयन भी अस्थायी फ़ाइलों का उपयोग जैसे sed(आप की कोशिश कर सकते बिजीबॉक्स एड - afaik कि यह एक अस्थायी फ़ाइल बनाने नहीं करता है)
echo। उपयोग करें printf। और sedअंतिम पंक्ति में कुछ चार आप जोड़ सकते हैं ताकि आप खाली स्थान खोने से बच सकें। इसके अलावा, आपके शेल को एक कमांड-लाइन में पूरी फाइल को संभालने में सक्षम होना चाहिए। यह आपका जोखिम है - पहले परीक्षण करें। bashउस पर विशेष रूप से बुरा है (मुझे लगता है कि यह w / स्टैक स्पेस करना है?) और कभी भी आप पर बीमार पड़ सकता है। दो sed'si कम से कम उन दोनों के बीच अच्छे प्रभाव के लिए कर्नेल के पाइप बफर का प्रयोग करेंगे की सिफारिश की है, लेकिन विधि काफी समान है। आपकी कमांड सब चीज़ भी अलग हो जाएगी fileकि sed w / सफल है या नहीं।
sed '/regex/!H;$!d;x' <file|{ read v && cat >file;}और अगर यह काम करता है मेरे बाकी जवाब पढ़ें। '