Chinaunix

标题: 【已经解决】基于DNS的字符替换问题 [打印本页]

作者: c386    时间: 2014-04-28 16:19
标题: 【已经解决】基于DNS的字符替换问题
本帖最后由 c386 于 2014-04-28 19:51 编辑

一个DNS的zone文件如下:

www     IN              A       192.168.1.2
            IN              A      192.168.1.3
www1    IN              A       1.1.1.1
            IN              A       1.1.1.2
            IN              A       1.1.2.3
            IN              A       1.1.1.4
            IN              A       1.1.2.5            
            IN              A       1.1.2.6           
            IN              A       1.1.2.7         
            IN              A       1.1.2.8
            

现在我想将其替换为:

www     IN              A       192.168.1.2
www     IN              A       192.168.1.3
www1    IN              A       1.1.1.1
www1    IN              A       1.1.1.2
www1    IN              A       1.1.2.3
www1    IN              A       1.1.1.4
www1    IN              A       1.1.2.5
www1    IN              A       1.1.2.6
www1    IN              A       1.1.2.7
www1    IN              A       1.1.2.8

请问大家该如何操作?谢谢了~!

作者: ly5066113    时间: 2014-04-28 16:30
awk 'NF==3{$0=s""$0}{s=$1}1' file
作者: jason680    时间: 2014-04-28 16:36
回复 1# c386

$ awk -vOFS="\t" '{W=NF>3?$1:W;$1=NF>3?$1:W"\t"$1}1' FILE
www        IN        A        192.168.1.2
www        IN        A        192.168.1.3
www1        IN        A        1.1.1.1
www1        IN        A        1.1.1.2
www1        IN        A        1.1.2.3
www1        IN        A        1.1.1.4
www1        IN        A        1.1.2.5
www1        IN        A        1.1.2.6
www1        IN        A        1.1.2.7
www1        IN        A        1.1.2.8

   
作者: jeffreyst    时间: 2014-04-28 16:49
本帖最后由 jeffreyst 于 2014-04-28 16:52 编辑

sed '2s/^   /www/;4,$s/^    /www1/' file

www     IN              A       192.168.1.2
www         IN              A      192.168.1.3
www1    IN              A       1.1.1.1
www1        IN              A       1.1.1.2
www1        IN              A       1.1.2.3
www1        IN              A       1.1.1.4
www1        IN              A       1.1.2.5            
www1        IN              A       1.1.2.6           
www1        IN              A       1.1.2.7         
www1        IN              A       1.1.2.8
作者: c386    时间: 2014-04-28 16:49
本帖最后由 c386 于 2014-04-28 16:53 编辑

对我来说抓破头的事,写了半天awk也没解决

1、2楼的两位轻而易举就解决了,可否对参数稍作讲解呢?

3楼的方法也是可以,但是我这边的环境zone文件里的条目很多,而且主机名比较复杂

自己学习的路还有很长啊
作者: q1208c    时间: 2014-04-28 16:58
如果是生产系统的 DNS zone 文件, 建议楼主手工编辑, 并找人帮你确认.

这可不是开玩笑的东西, 如果出错, 麻烦就大了.
作者: Shell_HAT    时间: 2014-04-28 17:36
回复 5# c386


    哪里不懂问哪里,否则从何讲起呢。
作者: c386    时间: 2014-04-28 19:55
q1208c 发表于 2014-04-28 16:58
如果是生产系统的 DNS zone 文件, 建议楼主手工编辑, 并找人帮你确认.

这可不是开玩笑的东西, 如果出错 ...


谢谢提醒

主要现在生产中用web管理DNS,导入配置的时候要求zone文件不能简写,必须补全,文件又非常多,所以想用脚本方便一些

弄完还会测试的,再次感谢
作者: c386    时间: 2014-04-28 19:58
Shell_HAT 发表于 2014-04-28 17:36
回复 5# c386


二楼的哥们写的,NF是列数,$0和$1也明白,组合在一起就不明白了……

三楼的哥们写的更看不懂了
作者: Herowinter    时间: 2014-04-28 22:02
回复 9# c386
根据你的文本,有www行的NF=4,没有的行NF=3
二楼的代码
  1. awk 'NF==3{$0=s""$0}{s=$1}1' file
复制代码
意思是每处理一行,如果该行的列数为3,
则把存在s中的内容拼在当前整行内容前;
拼接之后,再次把第一列的值存入s。

三楼的代码是类似的,只要能理解这句
W=NF>3?$1:W就行了,这句类似于
if(NF>3)
    W=$1;
else
    W=W;
作者: yestreenstars    时间: 2014-04-29 00:17
  1. sed -r 'N;/\n\s+/s/(\S+)(.*)\n(.*)/\1\2\n\1\3/;P;D'
复制代码

作者: jeffreyst    时间: 2014-04-29 08:55
学习中,mark~
作者: rulebook    时间: 2014-04-29 10:09
  1. awk '$1!~/IN/{c=$1}$1~/IN/{gsub(/^/,c)}1' o
复制代码

作者: jeffreyst    时间: 2014-04-29 10:28
回复 2# ly5066113


    你好,
您的这个语句awk 'NF==3{$0=s""$0}{s=$1}1' file和awk '{if(NF==3){$0=s""$0}else{s=$1}{print}}' file
好像是一样的,您的语句是后面那个的简写吗?我在哪里可以找到这种用法的介绍?多谢!
作者: Herowinter    时间: 2014-04-29 10:39
回复 14# jeffreyst
这两句不等价呀,原来的写法
s=$1这句对任意行肯定会执行;
你的写法这句只对NF!=3的行会执行,
当然,对于这个文本,得到的结果应该
是一样的。


   
作者: jeffreyst    时间: 2014-04-29 11:59
回复 15# Herowinter


    awk 'NF==3{$0=s""$0}{s=$1}1' file,可能是我没有太理解这个语句的执行过程
    我原来理解的这个语句的执行过程是:
    1.从目标文件中读出一行,
    2.若满足条件NF==3就执行{$0=s""$0},否则执行{s=$1}
    3.最后执行1,即print

    但是从你的解释来看,这个语句的执行过程好像应该是:
    1.从目标文件中读出一行,
    2.若满足条件NF==3就执行{$0=s""$0},
    3.执行{s=$1}
    4.最后执行1,即print
     即awk '{if(NF==3){$0=s""$0}{s=$1}}1'  file,
     我理解的这个过程正确吗?
作者: Herowinter    时间: 2014-04-29 13:01
回复 16# jeffreyst
你的第二个理解是对的,可以看这个,
每一行都执行了s=$1这个块。
  1. awk 'NF==3{$0=s""$0}{s=$1;print NR":"s}' i
  2. 1:www
  3. 2:www
  4. 3:www1
  5. 4:www1
  6. 5:www1
  7. 6:www1
  8. 7:www1
  9. 8:www1
  10. 9:www1
  11. 10:www1

  12. cat i
  13. www     IN              A       192.168.1.2
  14.             IN              A      192.168.1.3
  15. www1    IN              A       1.1.1.1
  16.             IN              A       1.1.1.2
  17.             IN              A       1.1.2.3
  18.             IN              A       1.1.1.4
  19.             IN              A       1.1.2.5            
  20.             IN              A       1.1.2.6           
  21.             IN              A       1.1.2.7         
  22.             IN              A       1.1.2.8
复制代码

作者: jeffreyst    时间: 2014-04-29 15:56
回复 17# Herowinter


    我好好理解下,多谢多谢!
     另外,我想问下NR==3是if(NR==3)的简写方式吗?我没有见过这种用法,在哪里可以找到对这种用法的解释?
作者: jeffreyst    时间: 2014-04-29 16:45
回复 17# Herowinter


    虽然我没有找到关于这个写法的文档,但是我这样试了下:
  1. [root@/workspace]# head -10 111
  2.      1  zqxzvg[]lmoxaduib]lh
  3.      2  a[llf]uoh[jchohhamsa
  4.      3  nzqsteqxhy]ntdrotjmt
  5.      4  lerfyqvaratlmdlonprd
  6.      5  vlif[]ymmtf]izlrdtan
  7.      6  jbqkbzantixgzp]hjoud
  8.      7  xtszrwycarjjctivtjdn
  9.      8  msxfvcziztap[kaavfzy
  10.      9  jg]knpdd[vqltcmbnzmd
  11.     10  vlmbvlslrt]nstlfpduc
  12. [root@/workspace]#
  13. [root@/workspace]# head -10 111 | awk 'NR>3{print $0}{print NR}'
  14. 1
  15. 2
  16. 3
  17.      4  lerfyqvaratlmdlonprd
  18. 4
  19.      5  vlif[]ymmtf]izlrdtan
  20. 5
  21.      6  jbqkbzantixgzp]hjoud
  22. 6
  23.      7  xtszrwycarjjctivtjdn
  24. 7
  25.      8  msxfvcziztap[kaavfzy
  26. 8
  27.      9  jg]knpdd[vqltcmbnzmd
  28. 9
  29.     10  vlmbvlslrt]nstlfpduc
  30. 10
  31. [root@/workspace]#
复制代码
这个测试,可以说明,NR>3和if(NR>3)是等价的,并且能说明后面的print NR是不受前面的条件限制的,每一次都打印,再次感谢!
作者: helloworld_gm    时间: 2014-04-29 19:29
awk 'NF==3{$0=s""$0}{s=$1}1' 运行后无效
作者: helloworld_gm    时间: 2014-04-29 19:42
这样可以运行实现正确结果:
awk '{s1=NF>2?$1:S1;s2=NF>2?$21;s3=NF>2?$32;$1=s1;$2=s2;$3=s3}1'  file
s1,s2,s3分别为第一列,第二列,第三列值代表。
作者: helloworld_gm    时间: 2014-04-29 19:43
上面笔误,sorry
这样可以运行实现正确结果:
awk '{s1=NF>2?$1:s1;s2=NF>2?$21;s3=NF>2?$32;$1=s1;$2=s2;$3=s3}1'  file
s1,s2,s3分别为第一列,第二列,第三列值代表。
作者: zzj315763    时间: 2014-04-29 22:05
$GENERATE 1-254  www1 IN A 192.168.1.$
zhe yang ke yi bu ?

作者: jeffreyst    时间: 2014-04-30 09:20
回复 21# helloworld_gm


    这位兄弟,在你的帖子中禁用下表情,
点击编辑,
右边“附加选项”中
选中禁用表情
作者: helloworld_gm    时间: 2014-04-30 09:27
OK,我禁用下试试
这样可以运行实现正确结果:
awk '{s1=NF>2?$1:s1;s2=NF>2?$21;s3=NF>2?$32;$1=s1;$2=s2;$3=s3}1'  file
s1,s2,s3分别为第一列,第二列,第三列值代表。
作者: helloworld_gm    时间: 2014-04-30 09:28

写错了,表情害死人,
这样可以运行实现正确结果:
awk '{s1=NF>2?$1:s1;s2=NF>2?$2:$1;s3=NF>2?$3:$2;$1=s1;$2=s2;$3=s3}1'  file
s1,s2,s3分别为第一列,第二列,第三列值代表。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2