使用sed / awk或类似的

时间:2015-12-09 11:50:31

标签: 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   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

似乎要做的伎俩,所以它实际上只是循环和通配符/忽略不能按预期工作的数值。

2 个答案:

答案 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