Unix 使用sed/awk或类似工具通过SSH就地编辑DNS记录

Unix 使用sed/awk或类似工具通过SSH就地编辑DNS记录,unix,awk,sed,Unix,Awk,Sed,我在一个目录中有很多文件,其中有3行需要编辑,如果第一行被编辑,但我不知道该怎么做。 重点是将我的MX记录从指向服务器改为指向邮件。而是将该点指向服务器IP。这使得在Cpanel中的迁移更加容易。我有成千上万的记录要查 DNS更新 第1行: example.com. 14400 IN MX 0 servername.com. 如果最后一个块是“servername.com”,则应改为mail.example.com,如下所示 example.com. 14400 I

我在一个目录中有很多文件,其中有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行

-或-

我需要将数字设置为今天的日期,格式为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
相反,它似乎不起作用。那么,我如何忽略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
#/垃圾箱/垃圾箱
而IF=读取dname
做
sed-i-r“s/mail\s*在*\sCNAME\s*servername.com/mail在8.8.8.8/g“$dname.db中
完成
完成后,再次假设完成了第一次编辑,我想将文件的第5行第一个块编辑为值YYYYMMDD09

#! /bin/sh
while IF= read dname
do
sed -i '5s/.*/\t\t2015121009 ; serial, todays date/' $dname.db
done < dirlist.txt
…
sed -i '5s/.*/\t\t2015121009 ; serial, todays date/' $dname.db
#/垃圾箱/垃圾箱
而IF=读取dname
做
sed-i'5s/*/\t\t2015121009;序列号,今天日期/'$dname.db
完成

似乎可以做到这一点,所以它实际上只是循环和通配符/忽略了不符合预期的数值。

您的规范不是很清楚(实际上令人困惑),但对于第一行,您可以这样做,也许可以开始为其余部分创建原型

$ awk 'FNR==1 {sub("servername.com.$","mail."$1)}1' file
将最后一个字段“servername.com.”更改为“mail.”前缀为第一个字段,仅用于第一行。如果您提供多个输入文件,它将对所有文件执行相同的操作(但输出将仅为一个,这是可以解决的)。请注意,这将保留输入文件间距

我想忽略这个领域,但写作

MX\s**\s*servername.com
MX\s**\s*servername.com
相反,它似乎不起作用

在这两个
\s*
之间只有一个
*
,但是要匹配任意数量的字符,需要
*
,因此
MX\s*\s*servername.com
可以工作

如果编辑未完成,我希望打破循环并继续 下一个文件

#! /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
您可以将所有三个编辑合并到一个
sed
调用中。由于您希望第二次和第三次替换仅在第1行上完成编辑时发生,因此您需要将第1行的所有内容都包装在commands块中
1{…}
,并在该块中前进到下一行(使用
n
,请参见下文)

我想编辑第5行,文件的第一个块的值 YYYYMMDD09

#! /bin/sh
while IF= read dname
do
sed -i '5s/.*/\t\t2015121009 ; serial, todays date/' $dname.db
done < dirlist.txt
…
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
读取dname时

做
sed-i“1{s/MX\s*\s*servername.com/MX 0 mail.$dname/;t继续;b
:continue;n;s/mail\s*在*\sCNAME\s*servername.com中/mail在8.8.8.8中/
n、 n;n;s/*/\t\t`date+%Y%m%d09`;序列,今天日期/}“$dname.db
完成
欢迎来到堆栈溢出。这是一个问答网站,不是免费的编码服务。向我们展示你的尝试和你的困境,我们很乐意帮助你理解如何解决你的问题。但要获得一些指导,请查看
man date
了解您的日期格式,并查看
man awk
了解其余内容。我不推荐sed来做这个。Ofc,我觉得我真的很愚蠢,我没有添加它。我现在编辑了这篇文章,把我所拥有的内容包括在内。