免费注册 查看新帖 |

Chinaunix

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

[文本处理] 想打印匹配行到不是空格为首的行之间的内容 [复制链接]

论坛徽章:
2
技术图书徽章
日期:2013-12-20 07:35:03技术图书徽章
日期:2014-12-16 12:59:42
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-05-09 10:33 |只看该作者 |倒序浏览
本帖最后由 General_715 于 2016-05-09 10:34 编辑

#cat a.txt
a1 =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = oracle)(PORT = 1000))

    (CONNECT_DATA =

      (SERVER = aaa)

      (SERVICE_NAME = aaa)

a2 =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = bbb-vip)(PORT = 1000))

    (CONNECT_DATA =

      (SERVER = ccc)

      (SERVICE_NAME = bbb)

a3 =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = ccc-vip)(PORT = 1000))

    (CONNECT_DATA =

      (SERVER = ccc)

      (SID = ccc)
之前会有一个列表 列出a1 a2 a3
如果输入a1 就打印从a1开始 到a2的上一行(就是打印到不以空格为首的上一行)
请问怎么写能打印出来

论坛徽章:
54
2015亚冠之德黑兰石油
日期:2015-07-07 13:00:1615-16赛季CBA联赛之深圳
日期:2016-03-31 09:03:5415-16赛季CBA联赛之辽宁
日期:2016-05-09 20:38:15程序设计版块每日发帖之星
日期:2016-05-12 06:20:0015-16赛季CBA联赛之四川
日期:2016-05-13 15:19:4715-16赛季CBA联赛之福建
日期:2016-05-15 20:24:34每日论坛发贴之星
日期:2016-05-16 06:20:0015-16赛季CBA联赛之吉林
日期:2016-05-26 11:49:4715-16赛季CBA联赛之广东
日期:2016-05-26 13:49:18极客徽章
日期:2016-12-07 14:05:2315-16赛季CBA联赛之广夏
日期:2016-12-20 17:33:532017金鸡报晓
日期:2017-01-10 15:19:56
2 [报告]
发表于 2016-05-09 10:47 |只看该作者
本帖最后由 haooooaaa 于 2016-05-09 11:09 编辑
  1. awk -vRS='a[0-9]+ *= *\n' -vk=3 'RT~"^a"k" "{getline;printf $0}'
复制代码
  1. awk -vk=3 '/^[^ ]+/{m=0}$0~"^a"k" "{m=1;next}m'
复制代码

论坛徽章:
4
程序设计版块每日发帖之星
日期:2015-10-14 06:20:00每日论坛发贴之星
日期:2015-10-14 06:20:00程序设计版块每日发帖之星
日期:2016-05-02 06:20:00程序设计版块每日发帖之星
日期:2016-05-08 06:20:00
3 [报告]
发表于 2016-05-09 10:55 |只看该作者
本帖最后由 mswsg 于 2016-05-09 13:14 编辑

顶下,厉害,学习!
楼主的意思是?比如输入a1,则打a1的内容到屏幕(shell)?
还是文本的提取?回复 2# haooooaaa
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. b = ['a1', 'a2']
  4. with open('1.txt', 'r') as f:
  5.     a = []
  6.     lines = f.readlines()
  7.     print(lines[0])
  8.     for x in lines:
  9.         if x.startswith('a'):
  10.             a.extend([x.strip().split()[0], lines.index(x),])
  11.     for i in b[:-1]:
  12.         if i in a:
  13.             c = a.index(i)
  14.             print ''.join(lines[a[c+1]:a[c+3]])
  15.     if b[-1] == a[-2]:
  16.         print ''.join(lines[a[int(a.index(b[-1]) + 1)]:])
  17.     else:
  18.         print ''.join(lines[a[int(a.index(b[-1])) + 1]:a[int(a.index(b[-1])) + 3]])
复制代码

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
4 [报告]
发表于 2016-05-09 11:19 |只看该作者
回复 1# General_715


$ awk 'BEGIN{while(getline < "a.txt"){if(/^[^ \t]+/){k=$1;printf k" ";d[++c]=k};a[k]=a[k]$0"\n"}printf "\ninput: ";getline;print a[$1]}'
a1 a2 a3
input: a1
a1 =
  (DESCRIPTION =
    ...
      (SERVICE_NAME = aaa)


$ awk 'BEGIN{while(getline < "a.txt"){if(/^[^ \t]+/){k=$1;printf k" ";d[++c]=k};a[k]=a[k]$0"\n"}printf "\ninput: ";getline;print a[$1]}'
a1 a2 a3
input: a2
a2 =
  (DESCRIPTION =
    ...
      (SERVICE_NAME = bbb)


$ cat a.txt
a1 =
  (DESCRIPTION =
    ...
      (SERVICE_NAME = aaa)

a2 =
  (DESCRIPTION =
    ...
      (SERVICE_NAME = bbb)

a3 =
  (DESCRIPTION =
    ...
      (SID = ccc)

   

论坛徽章:
28
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-16赛季CBA联赛之深圳
日期:2016-12-01 10:34:0415-16赛季CBA联赛之新疆
日期:2016-12-07 10:24:2915-16赛季CBA联赛之同曦
日期:2016-12-15 12:06:43CU十四周年纪念徽章
日期:2016-12-18 13:03:4415-16赛季CBA联赛之吉林
日期:2017-01-03 15:52:2515-16赛季CBA联赛之辽宁
日期:2017-01-04 14:58:2415-16赛季CBA联赛之辽宁
日期:2017-01-15 09:42:512016科比退役纪念章
日期:2017-02-06 17:21:50黑曼巴
日期:2017-02-10 15:46:1215-16赛季CBA联赛之上海
日期:2017-03-18 10:14:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
5 [报告]
发表于 2016-05-09 11:36 |只看该作者
  1. #如果每段行数一样
  2. val=a3
  3. grep "$val" -A10 a.txt

  4. #
  5. val=a3
  6. sed  '/'"$val"'/{:a;N;/\na/!{$!ba};s/\n\na.*//;b};d' a.txt
复制代码

论坛徽章:
29
程序设计版块每日发帖之星
日期:2016-02-29 06:20:0015-16赛季CBA联赛之天津
日期:2016-08-10 10:33:1115-16赛季CBA联赛之深圳
日期:2016-08-17 15:07:2015-16赛季CBA联赛之佛山
日期:2016-11-07 11:33:5015-16赛季CBA联赛之广夏
日期:2016-11-15 09:13:31CU十四周年纪念徽章
日期:2016-11-24 14:12:25极客徽章
日期:2016-12-07 14:03:4015-16赛季CBA联赛之深圳
日期:2016-12-07 17:15:2715-16赛季CBA联赛之北京
日期:2016-12-22 09:30:0115-16赛季CBA联赛之深圳
日期:2016-12-22 10:49:2115-16赛季CBA联赛之山西
日期:2017-02-10 09:05:3215-16赛季CBA联赛之同曦
日期:2017-02-27 14:19:08
6 [报告]
发表于 2016-05-09 11:42 |只看该作者
  1. awk -vs="a2" 'f&&/^[^ \t]+/{f=!f}$0~s" ="{f=1}f'
复制代码

论坛徽章:
0
7 [报告]
发表于 2016-05-09 14:07 |只看该作者
本帖最后由 lll1985911 于 2016-05-09 14:07 编辑

sed -r -n '/^a1/,/^a/{/^a/d;p}' FILE

论坛徽章:
10
天蝎座
日期:2013-09-22 22:32:23程序设计版块每日发帖之星
日期:2016-08-07 06:20:00lufei
日期:2016-06-17 17:38:40程序设计版块每日发帖之星
日期:2016-06-12 06:20:002016科比退役纪念章
日期:2016-05-31 15:47:20CU十四周年纪念徽章
日期:2016-05-27 12:24:562015年亚洲杯之阿曼
日期:2015-05-03 21:01:352015年辞旧岁徽章
日期:2015-03-03 16:54:15天蝎座
日期:2013-10-20 21:05:24程序设计版块每日发帖之星
日期:2016-08-11 06:20:00
8 [报告]
发表于 2016-05-10 09:37 |只看该作者
回复 1# General_715
  1. sed -nr '/^[^ ]/{x;/^a3/p;b};${x;/^a3/p;b};H'
复制代码

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
9 [报告]
发表于 2016-05-10 13:40 |只看该作者
  1. perl -ne '{m/\A\S/?($k=$_):push(@{$h{$k}},$_)}END{$,="\n";print "Enter a key:";chomp($k=<STDIN>);for(keys %h){print $_,@{$h{$_}} if(m/$k/)}}' f
复制代码

论坛徽章:
2
操作系统版块每日发帖之星
日期:2016-05-16 06:20:0015-16赛季CBA联赛之八一
日期:2016-05-18 15:38:22
10 [报告]
发表于 2016-05-11 10:15 |只看该作者
你这个应该是数据库的监听配置文件吧。
你试试这个脚本:
  1. if [ $# -gt 1 ];then
  2.         echo "参数过多!"
  3.         exit 1
  4. fi

  5. #输出文件中包含多少个server_name
  6. #将server_name附近加上#号
  7. sed  's/\(^[^ ]*\)\(.*\)/#\1#\2/g;s/##//g' a.txt >tempfile
  8. #获取各个server_name
  9. servers=`awk 'BEGIN{RS="#"}NR>1{print $0;getline}' tempfile`

  10. if [ $# -eq 0 ];then
  11. #打印server列表
  12. echo "server_name列表如下:`echo $servers`;如需查看对应列表,请使用:$0 server_name方式查看"
  13. rm tempfile
  14. exit 0
  15. fi

  16. name=$1
  17. #从tempfile中获取对应server_name的配置信息
  18. awk -v name1=$name 'BEGIN{RS="#"}NR>1{if($0 == name1){printf $0;getline;print $0;exit}}' tempfile > resultfile
  19. rm tempfile
复制代码
输入的服务名不对就查不到信息,懒得在脚本里面做判断了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP