Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2980924
  • 博文数量: 272
  • 博客积分: 5544
  • 博客等级: 大校
  • 技术积分: 5496
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-08 00:48
个人简介

  每个人都要有一个骨灰级的爱好,不为金钱,而纯粹是为了在这个领域享受追寻真理的快乐。

文章分类

全部博文(272)

文章存档

2015年(2)

2014年(5)

2013年(25)

2012年(58)

2011年(182)

分类: LINUX

2012-01-20 20:09:46

cat file:
test{
        admin:111
        index:aaa
        admin:111
}
normal{
        admin:3333
        index:bbb
        admin:3333
}
test{
        admin:111
        index:ccc
        admin:111
}

要求打印 test 段落里的 index 后面的值:
aaa
ccc



  1. sed '/^test{/{:a;N;/index/!{z;ba};s/.*://p};d' file
[解析]
命令中的 z 是关键,这是 GNU sed 的扩展功能,它的作用和 s/.*// 是等价的,就是清空 pattern space 里的内容,在这里我们从匹配到 test{ 开始的,N 读取下一行,如果没有匹配到 index 内容就清空 pattern space ,并跳转到标签 a 处,继续 N 读取下一行内容,一直读到包含 index 关键字的内容,把冒号以前的都替换掉,就只剩 index 后面的值了,然后打印出来。该功能只在 GNU sed 4.2 版本后才支持。 这是官方文档。




  1. sed -n '/^test{/{:a;n;/index/!ba;s/.*://p}' file
[解析]
其实 n 也可以实现往下的操作,特别注意的是 n 将操作转至下一行的同时,会默认输出 pattern space 里的内容,所以这里必须加 -n 参数,默认不打印 pattern space 里的内容。

  1. awk -F":" '/test{/{i=1};i&&/index/{print $2;i=0}' file
[解析]
awk也是可以的,用一个变量来确定。


阅读(2415) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~