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

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

文章分类

全部博文(272)

文章存档

2015年(2)

2014年(5)

2013年(25)

2012年(58)

2011年(182)

分类: LINUX

2012-03-08 15:35:07

cat file 
123
abc
234
abc
bcd
xyz
efg
xyz
xyz
wih

要求取到第一个 abc 开头最后一个 xyz 结尾的内容:
abc
234
abc
bcd
xyz
efg
xyz
xyz




  1. sed -n '/abc/{p;:a;n;H;/xyz/{x;s/\n//p;z;h};ba}' file
[解析]
首先说明,用 /m/,/n/ 这样的地址对取内容是肯定不行的。这个语句的思路是匹配到 abc 的关键字后就一直 H 追加到 hold space 里,直到遇见 xyz 关键字(该行内容也是追加到缓冲区),然后 x 交换出先追加到缓冲区的内容,替换掉第一个换行符,打印,然后再用 z 把 pattern space 清空,h 这时候也等于是清空了 hold space 里的内容,然后跳转到标记处,继续 n 执行下一行, H 追加到 hold space 里,如果后面还有 xyz 关键字同样会继续刚才的操作,如果没有一直到末尾,就结束命令。 z 是 gun sed 的扩展,4.2.0版本后支持。

 


  1. awk '/abc/,0{i=i?i"\n"$0:$0}/xyz/{print i;i=""}' file
  2. awk '/abc/{x=1}x{i=i?i"\n"$0:$0}/xyz/{print i;i=""}' file
[解析]
/abc/,0这个是取abc开始到最后的内容,跟第二个命令用一个变量开关是一个道理,用变量 i 来保存内容,遇到 xyz 关键自就打印出来,并清空变量i。


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