我在一个目录中有很多文件,如果编辑了第一行,我需要编辑3行,但我无法理解如何操作。 关键是要将我的MX记录从指向我的服务器更改为指向邮件。相反,并指向服务器IP。这使得Cpanel中的迁移变得更加容易。我有成千上万的记录要经历。
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:
在更改第1行的任何文件中增加DNS记录的序列号。 10位数字可以是任何数字,但始终是该行的第一个数字,并始终在第5行。
2015061800 ; serial, todays date+todays
-OR -
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,其中包含域名列表,查找并使用mail.domainname.com替换servername.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
似乎要做的伎俩,所以它实际上只是循环和通配符/忽略不能按预期工作的数值。
答案 0 :(得分:0)
你的规范不是很清楚(实际上令人困惑),但是对于第一行你可以做到这一点,或许可以让你开始为其余的原型。
$ awk 'FNR==1 {sub("servername.com.$","mail."$1)}1' file
将更改最终字段“servername.com”。用“邮件”。前缀第一个字段,仅适用于第一行。如果您提供多个输入文件,它将对所有文件执行相同的操作(但输出将只有一个,可以解决)。请注意,这会保留输入文件间距。
答案 1 :(得分:0)
我想忽略这个领域,但写作
MX\s**\s*servername.com
似乎不起作用。
两个\s*
之间只有一个*
,但为了匹配任意数量的任何字符,您需要.*
,因此MX\s*.*\s*servername.com
有效。
如果没有编辑,我想打破循环并继续 下一个文件。
您可以将所有三个修改合并为一个sed
来电。由于您希望仅在第1行进行编辑时才进行第二次和第三次替换,因此您将所有内容包装在第1行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