यूनिक्स में विभिन्न फाइलों में एक और के साथ ग्रंथों की पंक्तियों की जगह


2

मेरे पास सटीक उपडोमेन जानकारी के साथ 200 से अधिक बाँध एक्सटेंशन फ़ाइलों की एक सूची है।

एक उदाहरण स्कीमा इस तरह दिखता है।

# /named_ext/db.mysite.com
subdomain                    A       200.201.202.203

मुझे पूरी लाइन को तीन अलग-अलग लाइनों के सेट में बदलने की आवश्यकता है, यह पसंद करता है।

subdomain                    A       200.201.202.204
subdomain                    A       200.201.202.205
subdomain                    A       200.201.202.206

किसी भी विचार कैसे सभी /named_ext/फ़ाइलों के तहत इस तरह के प्रदर्शन करने के लिए ?


1
तो क्या खोज * A 200.201.202.203दूसरे शब्दों में, किसी भी उपडोमेन नाम, लेकिन विशिष्ट A और IP पते के लिए होगी, या उपडोमेन प्रत्येक फ़ाइल में समान है?
पॉल

उपडोमेन प्रत्येक फ़ाइल में समान है।
मार्टिन

1
क्या ips को हमेशा मूल आईपी के वेतन वृद्धि में जोड़ा जाना चाहिए या क्या वे स्थिर हैं?
7

वे निरंतर हैं।
मार्टिन

जवाबों:


2

आप exchange_ips.plतीन लगातार ips (फ़ंक्शन exchange_const()) या तीन वृद्धिशील ips (फ़ंक्शन exchange_incr()) द्वारा आईपी का आदान-प्रदान करने के लिए निम्नलिखित पर्ल स्क्रिप्ट का उपयोग कर सकते हैं । #स्क्रिप्ट के अंत में फ़ंक्शन कॉल के सामने बस एक टिप्पणी ( ) जोड़ें , जिसकी आपको आवश्यकता नहीं है।

ध्यान दें कि मूल आईपी के साथ 253या उच्चतर समाप्त होने पर एक या अधिक वृद्धिशील ips गलत होंगे ।

स्क्रिप्ट के साथ शुरू होने वाली सभी लाइनों को संशोधित करता है $domainname। यदि डोमेन नाम मायने नहीं रखता है या यदि आपकी फ़ाइलों में केवल एक / एक ही डोमेन के लिए लाइनें हैं, तो सेट करें my $domainname = ".+";

#! / Usr / bin / perl

सख्त का उपयोग करें;
चेतावनी का उपयोग करें;

my @data = <STDIN>;

मेरे $ domainname = "उपडोमेन";
मेरे $ const_ip1 = "123.123.123.123";
मेरे $ const_ip2 = "124.124.124.124";
मेरे $ const_ip3 = "125.125.125.125";

मेरा $ पैटर्न = qr / ^ ($ domainname \ s + A \ s +) ([\ d \।] +) / है;

उप एक्सचेंज_कॉस्ट ($) {
    मेरे $ डाटारेफ = शिफ्ट;
    मेरे $ पाया = 0;
    foreach (@ $ dataref) {
        अगर ($ _ = ~ m / $ पैटर्न /) {
            जब तक ($ नहीं मिला) {
                $ पाया = 1;
                प्रिंटफ "% s% s \ n% s% s \ n% s% s \ n", $ 1, $ const_ip1, $ 1, $ const_ip2, $ 1, $ const_ip3;
            }
        } अन्य {
            प्रिंट $ _;
        }
    }
}

उप विनिमय_संकल्प ($) {
    मेरे $ डाटारेफ = शिफ्ट;
    मेरे $ पाया = 0;
    foreach (@ $ dataref) {
        अगर ($ _ = ~ m / $ पैटर्न /) {
            जब तक ($ नहीं मिला) {
                $ पाया = 1;
                मेरी $ const = $ 1;
                my @iparr = विभाजित / END./, $ 2;
                (1 .. 3) के लिए {
                    $ Iparr [3] ++;
                    printf "% s% s \ n", $ const, सम्मिलित हों ",", @iparr;
                }
            }
        } अन्य {
            प्रिंट $ _;
        }
    }
}

# निरंतर आईपीएस के साथ आईपी का आदान-प्रदान
exchange_const (\ @ डेटा);

# वृद्धिशील ips के साथ आईपी विनिमय
exchange_incr (\ @ डेटा);

स्क्रिप्ट को इस तरह से कॉल करें:

perl exchange_ips.pl < your_file

सभी फ़ाइलों पर बैकअप (बैकअप के साथ):

for f in /named_ext/*; do rename s/$/.bak/ $f; perl exchange_ips.pl < $f.bak > $f; done

उदाहरण:

नमूना फ़ाइल को modifiy:

# कुछ फू
उपडोमेन A 200.201.202.203
# डुप्लिकेट
उपडोमेन A 200.201.202.203
# कुछ बार
otherdomain A 99.99.99.99
अन्य कंडोम 1.1.1.1
# एक और डुप्लिकेट
उपडोमेन A 200.201.202.203

का आउटपुट exchange_const():

# कुछ फू
उपडोमेन ए 123.123.123.123
उपडोमेन A 124.124.124.124
उपडोमेन A 125.125.125.125
# डुप्लिकेट
# कुछ बार
otherdomain A 99.99.99.99
अन्य कंडोम 1.1.1.1
# एक और डुप्लिकेट

का आउटपुट exchange_incr():

# कुछ फू
उपडोमेन A 200.201.202.204
उपडोमेन A 200.201.202.205
उपडोमेन A 200.201.202.206
# डुप्लिकेट
# कुछ बार
otherdomain A 99.99.99.99
अन्य कंडोम 1.1.1.1
# एक और डुप्लिकेट

महान, लेकिन मेरे लिए काम नहीं कर रहा है। नहीं लगता है कि बेक फाइलें बनाई जा रही हैं।
मार्टिन

मैं कुछ मामलों में देखता हूं, एक ही आईपी के साथ दो बार मूल रेखा घोषित की जाती है। वहाँ कोई रास्ता नहीं है regex के साथ दूसरे को हटाने के लिए वापसी की नकल से बचने के लिए और 6 लाइनों को प्राप्त करने से बचें?
मार्टिन

आप @Martin बदलने का प्रयास कर सकते हैं rename s/$/.bak/ $f;करने के लिए mv $f $f.bak;लूप में अगर renameकाम नहीं करता। इसके अलावा, मैंने अपने उत्तर / स्क्रिप्ट को डुप्लिकेट फ़िल्टर करने के लिए सिर्फ एक मिली हुई रेखा को याद करके और बाद के मैचों की अनदेखी करके संपादित किया।
21

2

लघु बैश लिपि

आप sedप्रत्येक फ़ाइल पर एक साधारण आदेश के साथ ऐसा कर सकते हैं :

for f in ./named_ext/* ; do
    sed -r -i 's/subdomain[ ]+A[ ]+200.201.202.203/subdomain A 200.201.202.204\nsubdomain A 200.201.202.205\nsubdomain A 200.201.202.206/g' $f
done

व्याख्या

लूप के लिए फ़ाइल का उपयोग करके लाइन एन्यूमरेट ./named_ext/*और रन करता है । नियमित expressian का विस्तार होगा और जगह में फ़ाइल को संपादित करेंगे।sed$f-r-i

नियमित अभिव्यक्ति की जगह

subdomain                    A       200.201.202.203

रिक्त स्थान के किसी भी संख्या के साथ

subdomain A 200.201.202.204
subdomain A 200.201.202.205
subdomain A 200.201.202.206

यदि आप रिक्ति को बनाए रखना चाहते हैं, तो आप रिक्त स्थान को sedलाइन में जोड़ सकते हैं ।


1
+1 अंत में एक अच्छा उपाय है sed! ;)
13

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.