अनुप्रयोग बग के रूप में अभी तक अनजाने में होने के कारण, मेरे पास एक पूर्ण डिस्क के साथ कई सौ सर्वर हैं। एक फ़ाइल है जो डुप्लिकेट लाइनों से भरी गई है - लॉग फ़ाइल नहीं है, लेकिन एक उपयोगकर्ता पर्यावरण फ़ाइल चर परिभाषाओं के साथ है (इसलिए मैं बस फ़ाइल को हटा नहीं सकता)।
मैंने 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;}
और अगर यह काम करता है मेरे बाकी जवाब पढ़ें। '