免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3141 | 回复: 13

[文本处理] 请求:sed文本块处理 [复制链接]

论坛徽章:
1
发表于 2015-07-28 14:12 |显示全部楼层
本帖最后由 guobaofu 于 2015-07-28 14:38 编辑

现在有这样一个文件,名为cndev.pp的puppet文件。我的要求:
1.判断如果这个文件node{}的结构体里包含 include ntp,将这行文本删除
2.在每个node{}的结构体里的尾部追加一行 include ntp ,include ntp前有两个空格


例子:

node 'cnwebadev02.tls.ad' {
#  class {'apache': server_type          => 'cnwebtest', adm_url             => 'cntestadm1', url      => 'cntest1', rproxy_ip => '10.91.27.89'}
#  class {'tlsconnect': server_type      => 'cnwebtest'}
#  class {'syslog': server_type          => 'cnwebtest'}
  class {'zabbix': roles                 => 'linux, apache, dev', ntp_server => '10.91.18.200', server => 'cnmon01.tls.ad'}
  class {'munin': roles                  => 'apache'}
#  class {'openssl': server_type         => 'test'}
  class {'fusioninventory': glpi_server_ip => 'cnasi01.tls.ad'}
  include php
}

源文件:
cat cndev.pp


##############################################
##               CN DEV                     ##
##############################################

#include basenode

################ CNWEBTEST ###################

node 'cnwebadev02.tls.ad' {
#  class {'apache': server_type          => 'cnwebtest', adm_url             => 'cntestadm1', url      => 'cntest1', rproxy_ip => '10.91.27.89'}
#  class {'tlsconnect': server_type      => 'cnwebtest'}
#  class {'syslog': server_type          => 'cnwebtest'}
  class {'zabbix': roles                 => 'linux, apache, dev', ntp_server => '10.91.18.200', server => 'cnmon01.tls.ad'}
  class {'munin': roles                  => 'apache'}
#  class {'openssl': server_type         => 'test'}
  class {'fusioninventory': glpi_server_ip => 'cnasi01.tls.ad'}
}

node 'cnwebadev03.tls.ad' {
#  class {'apache': server_type          => 'cnwebtest', adm_url             => 'cntestadm1', url      => 'cntest1', rproxy_ip => '10.91.27.89'}
#  class {'tlsconnect': server_type      => 'cnwebtest'}
#  class {'syslog': server_type          => 'cnwebtest'}
  class {'zabbix': roles                 => 'linux, apache, dev', ntp_server => '10.91.18.200', server => 'cnmon01.tls.ad'}
  class {'munin': roles                  => 'apache'}
#  class {'openssl': server_type         => 'test'}
  class {'fusioninventory': glpi_server_ip => 'cnasi01.tls.ad'}
}

############ CNDBTEST ########################

node 'cndbdev02.tls.ad' {
#  class {'syslog': server_type => 'cndbtest'}
#  class {'postgres': server_type => 'testdb'}
  class {'zabbix': roles => 'postgres, linux, dev', ntp_server => '10.91.18.200', server     => 'cnmon01.tls.ad'}
  class {'munin': roles => 'postgresql'}
#  class {'openssl': server_type => 'test'}
  class {'fusioninventory': glpi_server_ip => 'cnasi01.tls.ad'}
}

node 'cndbdev03.tls.ad' {
#  class {'syslog': server_type => 'cndbtest'}
#  class {'postgres': server_type => 'testdb'}
  class {'zabbix': roles => 'postgres, linux, dev', ntp_server => '10.91.18.200', server     => 'cnmon01.tls.ad'}
  class {'munin': roles => 'postgresql'}
#  class {'openssl': server_type => 'test'}
  class {'fusioninventory': glpi_server_ip => 'cnasi01.tls.ad'}
}

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
发表于 2015-07-28 14:43 |显示全部楼层
回复 1# guobaofu


    按块处理文件,还是上 awk/perl 吧,用 sed 太麻烦了:

  1. perl -nE ' if (/^node/ .. /^}/) { if (! /^\s*include ntp$/ and ! /^}$/) { print } elsif ( /}/ ) { print "  include ntp\n}\n" } } else { print } ' cndev.pp
复制代码

评分

参与人数 1信誉积分 +5 收起 理由
guobaofu + 5

查看全部评分

论坛徽章:
9
寅虎
日期:2013-12-02 12:49:22巨蟹座
日期:2014-07-18 18:13:34卯兔
日期:2014-07-25 14:43:08子鼠
日期:2014-07-26 10:10:51酉鸡
日期:2014-07-31 15:09:562015亚冠之本尤德科
日期:2015-05-19 09:27:382015亚冠之卡尔希纳萨夫
日期:2015-06-20 10:30:212015亚冠之阿尔纳斯尔
日期:2015-07-01 20:46:062015亚冠之城南
日期:2015-07-15 21:12:00
发表于 2015-07-28 14:49 |显示全部楼层
  1. sed '/include ntp/d;s/^}$/  include ntp\n&/' test.txt
复制代码

评分

参与人数 1信誉积分 +5 收起 理由
guobaofu + 5

查看全部评分

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
发表于 2015-07-28 14:54 |显示全部楼层
回复 3# lifayi2008


    oops,想多了

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
发表于 2015-07-28 15:22 |显示全部楼层
把Node和module直接关联不是最佳的做法,最好用
module ==>profile ==>role ==>node(一个node对应1个role)

那么你添加/删除一个module,只需要改profile,role里面都不需要改动。

假如你有200个Node,每个都需要添加一个新的module,你需要加200次。

但是你200个node有200个role, 假如role里面调用的profile不变,那么你只需要更新profile的module list...

论坛徽章:
1
发表于 2015-07-28 15:32 |显示全部楼层
本帖最后由 guobaofu 于 2015-07-28 15:50 编辑

回复 3# lifayi2008


  已测试,好用。辛苦了,哥们。。

能否给个例子让我看看

QQ: 493670120

论坛徽章:
1
发表于 2015-07-28 15:33 |显示全部楼层
回复 3# lifayi2008


哥们,你的sed也好用。。谢谢哟~~

   

论坛徽章:
1
发表于 2015-07-28 15:35 |显示全部楼层
回复 5# expert1

谢谢仁兄的指导,我也上刚刚学习,以后puppet不明白和有疑难的时候,请帮助。。




   

论坛徽章:
9
寅虎
日期:2013-12-02 12:49:22巨蟹座
日期:2014-07-18 18:13:34卯兔
日期:2014-07-25 14:43:08子鼠
日期:2014-07-26 10:10:51酉鸡
日期:2014-07-31 15:09:562015亚冠之本尤德科
日期:2015-05-19 09:27:382015亚冠之卡尔希纳萨夫
日期:2015-06-20 10:30:212015亚冠之阿尔纳斯尔
日期:2015-07-01 20:46:062015亚冠之城南
日期:2015-07-15 21:12:00
发表于 2015-07-28 15:49 |显示全部楼层
我这是偷懒的写法,搞计算机想多点没坏处 回复 4# MMMIX


   

论坛徽章:
20
卯兔
日期:2015-01-26 22:05:142015亚冠之萨济拖拉机
日期:2015-09-10 15:15:282015亚冠之阿尔希拉尔
日期:2015-09-25 17:37:53程序设计版块每日发帖之星
日期:2015-10-03 06:20:00程序设计版块每日发帖之星
日期:2015-12-09 06:20:00CU十四周年纪念徽章
日期:2015-12-17 09:07:15程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:342015亚冠之广州富力
日期:2015-08-27 19:29:56每日论坛发贴之星
日期:2015-08-26 06:20:002015亚冠之阿尔希拉尔
日期:2015-05-18 17:26:27
发表于 2015-07-28 20:38 |显示全部楼层
本帖最后由 songyc_2015 于 2015-07-28 23:33 编辑

回复 1# guobaofu
感觉需求不明确,第1点把含有“include ntp”的行删除了,第2点又把“include ntp”加回来?还是不加回来?又加回来不是多此一举么?

不加回来(即删除):
  1. sed '/node/{:1;$b2;N;/\n}/!b1;:2;s#\n *include ntp *##;t;s#}$#  include ntp\n}#}' file
复制代码
加回来(即不删除):
  1. sed '/node/{:1;$b2;N;/\n}/!b1;:2;/include ntp/b;s#}$#  include ntp\n}#}' file
复制代码
刚开始我是理解错误的,以为node{}存在““include ntp”“则删除这个node:
  1. sed '/node/{:1;$b2;N;/\n}/!b1;:2;/include ntp/d;s#}$#  include ntp\n}#}' file
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP