免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3919 | 回复: 7
打印 上一主题 下一主题

请教取2关键字之间的行!!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-02-18 22:51 |只看该作者 |倒序浏览
本帖最后由 chenhaimingwork 于 2012-02-18 23:05 编辑

请教如何取2个关键字段中间的行 ~。。。 含关键字的文本如下 :
----------------------------------------------------------------


test.sale.com.Null 。。。
。。。
。。。
。。。
the end.out sale1.com 服务器初始化错误error.ko
sale4.com 服务器初始化错误error.kd
sale4.com 服务器初始化错误error.dev
sale2.com 服务器初始化错误error.pci
test.sale.com 。。。
。。。
。。。
。。。
the end.out sale3.com 服务器初始化错误
sale5.com 服务器初始化错误
sale4.com 服务器初始化错误null
sale5.com 服务器初始化错误
sale2.com 服务器初始化错误
test.sale.com.Null 。。。
。。。
。。。
。。。
the end.out



现在问题是 :

       取出test.sale.com the end.out 之间的行(包括2个关键字其本身),但是是取一个文本最前面和最末尾关键字之间的行,从test.sale.com 开始,中间如果遇到这2个关键字,不理会,直到遇到文本里最后一个 the end.out ,然后取之间的行(包括2个关键字自身)另存一个文本里 !!


   我想了很久,现在的方案是  sed -n '/关键字/,/关键字/w /tmp/tmp.txt' ,  但是这个写法是一段一段取的,这样就导致文本中间类似于:
sale5.com 服务器初始化错误
sale4.com 服务器初始化错误null
   
上面这样的行就取不到了!

如果是整个文本中2个关键字之间的行(非一段一段),则可以取到这些行
但是小弟才疏学浅,不会写  {:3_201:}

求大牛帮忙 ! 非常感谢 !










-----

论坛徽章:
0
2 [报告]
发表于 2012-02-18 23:19 |只看该作者
本帖最后由 hbmhalley 于 2012-02-19 12:56 编辑

sed '/^key1$/{h;:n;/^key2$/{x;p;n;h;bn;};n;H;bn;}' urfile > tmp
  1. sed -n '/^key1$/{h;:n;/^key2$/{x;p;n;h;bn;};n;H;bn;}' urfile > tmp
复制代码

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
3 [报告]
发表于 2012-02-19 05:52 |只看该作者
本帖最后由 rdcwayx 于 2012-02-19 05:54 编辑
  1. awk '/test.sale.com/{t=1} t {a=a RS $0} /the end.out/{p=a;s=1}
  2.     END{print s?p:"No the end.out line"}' infile
复制代码

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
4 [报告]
发表于 2012-02-19 11:32 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
1
辰龙
日期:2014-05-22 11:38:58
5 [报告]
发表于 2012-02-19 12:02 |只看该作者
  1. awk 'BEGIN{flag=-1}/^test.sale.com/{if(buf != "")print buf; buf="";flag=1} /^the end.out/{print;flag=0} flag==1{print ;next} flag != -1{buf=buf?buf RS $0:$0}' urfile
复制代码
  1. sed -n '/^test.sale.com/{:a;${s/##.*$//;s/@@/\nthe end.out/g;p;q};$!N;/\nthe end.out/{s/\nthe end.out/@@/;s/##//;s/$/##/;ba};ba}' urfile
复制代码

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
6 [报告]
发表于 2012-02-19 12:07 |只看该作者
sed -n '/start/{H;:a;n;H;/end/{x;s/^\n//p;s/.*//;h};ba}'

awk '/start/{p=1;t=$0;next}p{t=t RS $0}/end/{print t;t=""}'

论坛徽章:
0
7 [报告]
发表于 2012-02-20 20:56 |只看该作者
hbmhalley 发表于 2012-02-18 23:19
sed '/^key1$/{h;:n;/^key2$/{x;p;n;h;bn;};n;H;bn;}' urfile > tmp




太给力了!!!!!{:3_193:} ,就这么一句就实现了,sed -n  '/^key1$/{h;:n;/^key2$/{x;p;n;h;bn;};n;H;bn;}' urfile > tmp

红色的部分用法根本就没看过~  {:3_191:}  。。。汗啊,高人,能详细解说一下么 ~  


论坛徽章:
0
8 [报告]
发表于 2012-02-20 22:35 |只看该作者
回复 7# chenhaimingwork


    哈哈惭愧 就是把行屯起来 碰到key2就吐出来 剩下的就是细节了 6L的也不错啊
    语法不懂? h(tmp = pattern) ; x (swap(tmp,pattern)) ; p (print (pattern)) ; n (read (pattern)) ; H (tmp += '\n'+pattern) ; bn (goto n) ; :n (你懂的)
    意识流了 还是翻手册去吧
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP