免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1614 | 回复: 6

[文本处理] awk的RS的疑惑 [复制链接]

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00
发表于 2015-12-07 18:02 |显示全部楼层
本帖最后由 九方流云 于 2015-12-07 18:28 编辑

大家好,有个文本处理的问题,文本开头部分以-分割,l两个-之间为一个配置部分,但是文本其他部分或许也有-,文本开头部分如下,除了下面的部分,其他部分都没有以-开头:
- storage_address: 10.20.20.130
  fqdn: node-10.domain.tld
  public_netmask: 255.255.255.0
  public_address: x.x.x.x
  storage_netmask: 255.255.255.0
  uid: "1"
  internal_address: x.x.x.x
  internal_netmask: 255.255.255.0
  role: controller
  name: node-10
- storage_address: 1x.x.x.x
  fqdn: node-11.domain.tld
  public_netmask: 255.255.255.0
  public_address: x.x.x.x
  storage_netmask: 255.255.255.0
  uid: "2"
  internal_address: x.x.x.x
  internal_netmask: 255.255.255.0
  role: compute
  name: node-11
- storage_address: x.x.x.x
  fqdn: node-12.domain.tld
  public_netmask: 255.255.255.0
  public_address: x.x.x.x
  storage_netmask: 255.255.255.0
  uid: "3"
我执行命令如下:
root@node-10:~# awk  -vRS='-'  '/role: controller/{print $0}'  /etc/astute.yaml
10.domain.tld
  public_netmask: 255.255.255.0
  public_address: x.x.x.x
  storage_netmask: 255.255.255.0
  uid: "1"
  internal_address: x.x.x.x
  internal_netmask: 255.255.255.0
  role: controller
  name: node
但是我执行下面的命令就是RS改为^-,结果除了-分割的部分,不以-分割的部分都打印出来了
root@node-10:~# awk  -vRS='^-' ' /role: controller/{print $0}'  /etc/astute.yaml
--
storage:
  vc_user: ""
  vc_host: ""
  osd_pool_size: "2"
  metadata:
    label: Storage
    weight: 60
  images_ceph: false
  iser: false
  volumes_ceph: false
  volumes_lvm: true
  ephemeral_ceph: false
  objects_ceph: false
  vc_datacenter: ""
  volumes_vmdk: false
  pg_num: 128
  vc_datastore: ""
  vc_image_dir: /openstack_glance
我要的被两个-分割的部分中,如果能匹配role: controller,则打印出此部分中的public_address地址:
root@node-10:~# awk  -F" +|\n" -vRS='^-' '/role: controller/{for(i=1;i<NF;i++){if($i~/public_address/){print $(i+2);exit}}}'  /etc/astute.yaml
x.x.x.x
虽然结果能出来,但是我很疑惑,为啥RS="^-",结果打印了文本所有结果。
PS:表情的地方是冒号和竖线,一直打不上去。
此外我又试验了一下
root@node-10:~# seq 10 |awk -vRS="^1" '{print $0}'


2
3
4
5
6
7
8
9
10
到现在是疑惑重重,希望大神解惑!

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
发表于 2015-12-08 09:08 |显示全部楼层


你已经自定义了RS, 记录已经不按\n分割了, ^只匹配整个缓冲区的开头, \n后面的不逄开头

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
发表于 2015-12-08 09:08 |显示全部楼层
s/不逄/不算/

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00
发表于 2015-12-08 09:27 |显示全部楼层
大神,那我想要以-开头作为RS,然后找出某一配置部分中如果有role: controller部分,则打印出public_address的地址呢。另外令我疑惑的是,我那个awk  -F" +|\n" -vRS="-" '/role: controller/{for(i=1;i<NF;i++){if($i~/public_address/){print $(i+2);exit}}}'  /etc/astute.yaml在三个环境中都能匹配成功,虽然貌似不正确。
回复 3# waker


   

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
发表于 2015-12-08 09:48 |显示全部楼层
-vRS="\n-|^-"

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00
发表于 2015-12-08 09:56 |显示全部楼层
厉害,真巧妙的方法!我又想了个笨办法
awk -F" +|\n|:" -vRS="storage_address" '$0~/role: controller/&&$0~/public_address/{for(i=1;i<=NF;i++){if($i~/public_address/){print $(i+2)}}}' /etc/astute.yaml
以storage_address开头,多谢大神了,

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00
发表于 2015-12-08 10:01 |显示全部楼层
本帖最后由 九方流云 于 2015-12-08 10:20 编辑

明白了^-|\n-就是缓冲区如果以-开头和中间-作为分隔符,是我没理解清楚大神的意思,
回复 5# waker


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP