मैं एक सूची कैसे ले सकता हूं और इसे एक फ़ाइल से हटा दूं?


10

मेरे पास डोमेन नामों की एक लंबी सूची है, जिन्हें मुझे / etc / remotedomains से हटाने की आवश्यकता है। वे शायद फ़ाइल में किसी विशेष क्रम में नहीं हैं। प्रत्येक डोमेन एक लाइन पर है।

मैं सूची के माध्यम से कैसे पुनरावृत्त कर सकता हूं और दूरस्थ डोमेन में उस पंक्ति को ढूंढ सकता हूं और इसे हटा सकता हूं।

जवाबों:


11
grep -Fxf list -v /etc/remotedomains > remotedomains.new
mv remotedomains.new /etc/remotedomains

-vकेवल उत्पादन लाइनों है कि पैटर्न से मेल नहीं खाते को ग्रेप बताता है।

-f listग्रेप बताता है फ़ाइल से पैटर्न को पढ़ने के लिए list

-Fग्रेप बताता है (ताकि आप regex मेटा-पात्रों के साथ मुसीबत में नहीं चलेंगे) सादे तार, नहीं नियमित अभिव्यक्ति के रूप में पैटर्न की व्याख्या करने के।

-xग्रेप बताता है एक पैटर्न है या नहीं, पूरे लाइन से मिलान करने जैसे fooकि केवल लाइन निकाल देना चाहिए foo, नहीं लाइन foobarया barfoo


3
नोट: हमेशा बैकअप /etc/localdomainsऔर /etc/remotedomainsइस तरह से सामान करने से पहले याद रखें ।
xenoterracide

3
-Fनिश्चित स्ट्रिंग मिलान ("सटीक मिलान") के लिए है, लेकिन यह पैटर्न को पूरी रेखा से मेल खाने के लिए मजबूर नहीं करता है । POSIX -xध्वज को उन उदाहरणों से मेल खाने के लिए सीमित करता है जहां एक पैटर्न पूरी रेखा से मेल खाता है।
क्रिस जॉन्सन

@ क्रिस: बाह, अच्छा कैच।
sepp2k

1

कॉम का उपयोग करें!

comm -23 /etc/remotedomains remove

मैन पेज से:

क्रमबद्ध फ़ाइलों FILE1 और FILE2 लाइन की तुलना लाइन द्वारा करें।

कोई विकल्प नहीं होने के साथ, तीन-स्तंभ आउटपुट का उत्पादन करें। कॉलम एक में FILE1 के लिए अद्वितीय लाइनें हैं, कॉलम दो में FILE2 के लिए अद्वितीय लाइनें हैं, और कॉलम तीन में दोनों फ़ाइलों के लिए आम लाइनें हैं।

विकल्प -1, -2 और -3 संबंधित कॉलम को अक्षम करते हैं।

हालाँकि यह आवश्यक है कि फ़ाइलों को क्रमबद्ध किया जाए।


0

sed -r -i -e '/^(domain1|domain2|domain3|...|domainN)$/d' domainlist.txt

यदि हटाने के लिए आपके डोमेन की सूची एक फ़ाइल में है:

sed -r -i -e '/^'"$(xargs <removelist.txt|sed -e 's/ /|/g)"')$/d' domainlist.txt

टिप्पणियाँ:

  1. Use -i.bak का sed करने के लिए domainlist.txt का बैकअप बनाएं

  2. यदि removelist.txt में कई हजारों प्रविष्टियाँ हैं, तो यह अधिकतम कमांड लाइन की लंबाई को ओवरफ्लो कर सकता है। यह बहुत संभावना परिदृश्य नहीं है, लेकिन कुछ ऐसा है जिसके बारे में आपको जानकारी होनी चाहिए।

आगे के प्रतिबिंब पर, उस जोखिम को समाप्त किया जा सकता है:

for RE in $(xargs <removelist.txt|sed -e 's/ /|/g') ; \
  do sed -r -i -e '/^('"$RE"')$/d' domainlist.txt ; \
done
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.