2015-12-09 52 views
0

我在一個單獨的目錄中有很多文件,其中有3行我需要編輯,如果第一行被編輯,但我不能包裹我的頭周圍怎麼做。 重點是將MX記錄從指向我的服務器改爲指向郵件。相反,並指向服務器IP。這使得Cpanel中的遷移變得更容易。我有成千上萬的記錄要經過。通過sed/awk或類似的SSH通過SSH就地編輯DNS記錄

DNS更新

1號線:

example.com. 14400 IN MX 0 servername.com. 

如果最後一個塊是 「servername.com」,應改爲mail.example.com執行,而不是像這樣

example.com. 14400 IN MX 0 mail.example.com. 

如果這裏沒有什麼改變,我想跳過下一個部分,然後轉到目錄中的下一個文件。

第2行:

mail IN CNAME servername.com 

對於任何記錄,其中線1改變,這條線應改爲

mail IN A 8.8.8.8 

行3:

遞增的序列號的DNS記錄在第1行被更改的任何文件中。 10位數字可以是任何東西,但始終是該行的第一行,並始終在#5行。

2015061800 ; serial, todays date+todays 

- 或 -

2015061800 ;Serial Number 

我需要設置數字到今天的日期格式YYYYMMDD09

這是我到目前爲止有:

#! /bin/sh 
while IF= read dname 
do 
sed -i -r "s/MX\s*0\s*servername.com/MX 0 mail.$dname/g" $dname.db 
done < dirlist.txt 

這需要dirlist.txt包含一個域名列表,找到並重新放置ces servername.com與mail.domainname.com爲文件domainname.com.db。這工作,但原來的字段可以有不同的MX和servername.com之間的數值。我想忽略該字段,但寫入

MX\s**\s*servername.com 

似乎不工作。那麼我該如何忽略0或100或者其他值呢?

此外,如果編輯完成上面,我想循環下面的語句爲同一個文件。如果編輯沒有完成,我想打破循環並繼續下一個文件。

#! /bin/sh 
while IF= read dname 
do 
sed -i -r "s/mail\s*IN*\sCNAME\s*servername.com/mail IN A 8.8.8.8/g" $dname.db 
done < dirlist.txt 

之後做到這一點,再次假設第一編輯是這樣做,我想編輯第5行,該文件以價值YYYYMMDD09的第一個塊。

#! /bin/sh 
while IF= read dname 
do 
sed -i '5s/.*/\t\t2015121009 ; serial, todays date/' $dname.db 
done < dirlist.txt 

似乎這樣的伎倆,所以它實際上只是循環和通配符/忽略的數值是不工作的打算。

+1

歡迎堆棧溢出。這是一個問答網站,而不是免費的編碼服務。向我們展示您嘗試過的方式以及卡住的位置,我們很樂意幫助您瞭解如何解決您的問題。 – tripleee

+0

什麼tripleee說。但是對於一些指導,請看日期格式的'man date',其餘的'man awk'。我不會推薦sed這個。 –

+0

Ofc,我覺得真的很愚蠢,我沒有添加它。我現在編輯了這篇文章,包括我的內容。 – guppshouse

回答

0

你的規格不是很清楚(實際上令人困惑),但對於第一行你可以做到這一點,也許你會開始爲其餘的原型。

$ awk 'FNR==1 {sub("servername.com.$","mail."$1)}1' file 

將改變最終字段「servername.com」。與「郵件」。前綴第一個字段,僅用於第一行。如果您提供多個輸入文件,它將對所有文件執行相同操作(但輸出將只有一個,可以解決)。請注意,這保留了輸入文件的間距。

0

我想忽略的領域,但是寫

MX\s**\s*servername.com 

反而似乎並沒有工作。

有兩個\s*之間你只有一個*,但匹配任何數目的字符,你需要.*,所以MX\s*.*\s*servername.com作品。

如果編輯沒有完成,我想打破循環並繼續到 下一個文件。

您可以將所有三個編輯合併爲一個sed呼叫。既然你想要第二次和第三次替換髮生,只有在第一行上進行編輯時,你會將所有行都包含在第一行的1{…}的命令塊中,並且如果是這樣的話,在這個塊內前進到下一行(n,見下面)。

我想編輯線5,該文件的第一塊的值 YYYYMMDD09。

… 
sed -i '5s/.*/\t\t2015121009 ; serial, todays date/' $dname.db 

自動插入今天的日期,你可以使用

s/.*/\t\t`date +%Y%m%d09` ; serial, todays date/ 

(但雙引號內)。

共有:

while read dname 
do 
    sed -i "1{s/MX\s*.*\s*servername.com/MX 0 mail.$dname/;tcontinue;b 
     :continue;n;s/mail\s*IN*\sCNAME\s*servername.com/mail IN A 8.8.8.8/ 
     n;n;n;s/.*/\t\t`date +%Y%m%d09` ; serial, todays date/}" $dname.db 
done < dirlist.txt