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

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

文章分类

全部博文(272)

文章存档

2015年(2)

2014年(5)

2013年(25)

2012年(58)

2011年(182)

分类: LINUX

2011-12-30 10:57:13

cat file
   
                           
                           
           
                           
   
                           
   
                   
                   
                   
                   
                   
   

要求匹配到 black_r 0x0a 的段落,然后打印出 cmd: 后面的十六进制的值:
0x0a,0x00
0x0a,0x05



  1. awk -F"\n" -vRS='<![^>]*>' 'i~/black_r 0x0a/{for(n=0;n++<NF;){if($n~/,/){split($n,a,"\"|:");print a[3]}}}{i=RT}' file
[解析]
首先对段落的操作,一般处理 RS ,把它设置为我们的段落分割行,比如  ,把这一行段落分割标记处理为 RS,再把 FS 处理为换行,这样匹配到我们需要的段落 RT 内容,就内容进行处理,遍历每个字段,匹配到逗号的行,就再拆分它,最后打印出我们要的内容,效率是不是很低?代码又长。




  1. awk -F"[:\"]" '/black_r 0x0a/{i=1;next};i{if(/<!--/)exit;print $3}' file
[解析]
这个方法从效率上,要高很多,它没有循环,匹配到内容就退出。利用一个变量开关,这也是非常好的办法,当匹配到我们要的内容后就打开这个开关,然后开始打印我们需要的内容,直到匹配到下个段落的分割标志,我们就退出整个操作,不用逐一匹配到文件最后,在大文件下操作,这个方法效率很不错。




  1. sed -rn '1h;/!/!{1!H;$!b};1!{x;/black_r 0x0a/{s/(^[^\n]*\n)?[^:\n]*:([^"]*)[^\n]*/\2/g;p}}' file
[解析]
sed对段落的操作在我sed板块讲了很多了,基本可以沿用这种模式,只是最后的sed替换出我们要的内容需要多尝试。







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