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

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

文章分类

全部博文(272)

文章存档

2015年(2)

2014年(5)

2013年(25)

2012年(58)

2011年(182)

分类: LINUX

2011-09-23 14:19:28

文本:
1
2
foo
3
4
5
foo
6
7
8

要得到最后一个foo以后的内容:
foo
6
7
8


  1. sed -n 'H;/foo/{h};${x;p} file
[解析]
H把每行的内容都追加进hold space,当匹配到foo时,h是拷贝进缓冲区,那等于说是把之前追加的内容都清空了,用foo覆盖之前的所有内容,那匹配到最后一个foo的时候肯定就覆盖了之前的所有追加的内容了,直到文件最后,x交换出hold space里的内容,然后打印。


  1. awk 'BEGIN{while(getline <"file"){j++;if(/foo/)i=j}}NR>=i' file
[解析]
awk是在BEGIN中先找出最后一个foo的行,然后打印这个行以后的内容。


如果要是只打印foo之后的行(不包含foo)呢?awk很好改,NR>i就行了,sed呢?想想,加个n,匹配到foo时就转向下一样操作。
  1. sed -n 'H;/foo/{n;h};${x;p}' file

  2. awk 'BEGIN{while(getline <"file"){j++;if(/foo/)i=j}}NR>i' file

阅读(4100) | 评论(0) | 转发(2) |
0

上一篇:awk之自定义函数

下一篇:gets函数

给主人留下些什么吧!~~