免费注册 查看新帖 |

Chinaunix

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

[文本处理] 求助:sed截取文本多行信息 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-09-02 17:34 |只看该作者 |倒序浏览
本帖最后由 urok 于 2015-09-02 17:36 编辑

看官好,小弟想从日志文件中根据行头行尾截取其中多行信息,文本例子如下:
  1. [DEBUG]|2015-09-02 00:09:17,945||Processor.java:174|==> 获取数据 count=1 cost=73ms
  2. ......(此处省略N行)
  3. RESPONSE STRING:
  4. ------------------------------------------------------------
  5. {ID=["1915090201504937"], MD5_CHECK=["8A344523332566EFCBBA1A30CE6A4007"], STATE=["22"], CODE=["T4011003"], PASSWORD=[""], X_RSPCODE=["0000"], X_RSPDESC=["success"], X_RESULTINFO=["success"], X_RESULTCODE=["0"]}

  6. Name           OCC   VALUE
  7. ------------------  ----  ------------------------------
  8. ACCEPT_DATE         0     20150902001051
  9. ACCEPT_MONTH        0     9
  10. ACTIONCODE          0     0
  11. ACTION_REASON       0     
  12. ......(此处省略N行)
  13. =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*

  14. [DEBUG]|2015-09-02 00:09:19,164||Sender.java:127|==> [chgDataVO2Send]发送批量报文: cost=677ms
  15. [ INFO]|2015-09-02 00:09:19,164|9020009190990004 MsgTranslator.java:90|==> rspCode:0000
复制代码
需截取从“MD5_CHECK=”这行开始,到“=*=*”这行为止,我在centos中写了个脚本:
  1. sed -n '/MD5_CHECK=\[\"$2/{:a;N;/=\*/!ba;p;q}' $file
复制代码
能达到我想要的效果,但到了AIX中就不行了,提示:
sed: The label /MD5_CHECK=\[\"$2/{:a;N;/=\*/!ba;p;q} is greater than eight characters.

求助,能实现就行,不限于sed,不甚感激!

论坛徽章:
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 [报告]
发表于 2015-09-02 17:42 |只看该作者
  1. awk '/=\*=\*/{exit}/MD5_CHECK/{a=1}a' e
复制代码
在linux测试的. AIX不知道...

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
3 [报告]
发表于 2015-09-02 17:42 |只看该作者
回复 1# urok


    直接用 sed -n '/MD5_CHECK/,/^=\*=/p' 不行么?

论坛徽章:
7
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:57:092015小元宵徽章
日期:2015-03-06 15:58:18程序设计版块每日发帖之星
日期:2015-08-09 06:20:00每日论坛发贴之星
日期:2015-08-09 06:20:00程序设计版块每日发帖之星
日期:2015-08-22 06:20:00程序设计版块每日发帖之星
日期:2015-08-27 06:20:00
4 [报告]
发表于 2015-09-02 17:53 |只看该作者
本帖最后由 tuyajie 于 2015-09-02 17:54 编辑

AIX的sed也经常在论坛里看到啊。是不是跟Linux版本不一致啊?

论坛徽章:
20
卯兔
日期:2015-01-26 22:05:142015亚冠之萨济拖拉机
日期:2015-09-10 15:15:282015亚冠之阿尔希拉尔
日期:2015-09-25 17:37:53程序设计版块每日发帖之星
日期:2015-10-03 06:20:00程序设计版块每日发帖之星
日期:2015-12-09 06:20:00CU十四周年纪念徽章
日期:2015-12-17 09:07:15程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:342015亚冠之广州富力
日期:2015-08-27 19:29:56每日论坛发贴之星
日期:2015-08-26 06:20:002015亚冠之阿尔希拉尔
日期:2015-05-18 17:26:27
5 [报告]
发表于 2015-09-02 17:58 |只看该作者
本帖最后由 songyc_2015 于 2015-09-02 17:59 编辑

回复 1# urok
"能达到我想要的效果,但到了AIX中就不行了,提示:
sed: The label /MD5_CHECK=\[\"$2/{:a;N;/=\*/!ba;p;q} is greater than eight characters"

这是aix下sed的命令解析问题,一般定义标签,使用标签,或右大括号都需要换行才可以识别,或者用另外一种写法:使用-e选项。

论坛徽章:
0
6 [报告]
发表于 2015-09-02 19:38 |只看该作者
回复 3# MMMIX


    呃,可以,我把问题想复杂了,多谢!

论坛徽章:
0
7 [报告]
发表于 2015-09-02 20:30 |只看该作者
songyc_2015 发表于 2015-09-02 17:58
回复 1# urok
"能达到我想要的效果,但到了AIX中就不行了,提示:
sed: The label /MD5_CHECK=\[\"$2/{: ...


尝试加了几个-e,都不对,求教

论坛徽章:
0
8 [报告]
发表于 2015-09-02 20:35 |只看该作者
haooooaaa 发表于 2015-09-02 17:42
在linux测试的. AIX不知道...


AIX测试不行:
syntax error The source line is 1.
The error context is
                 >>> /= <<<
awk: Quitting
The source line is 1.

论坛徽章:
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
9 [报告]
发表于 2015-09-03 00:01 |只看该作者
回复 1# urok

There has a easy way for Unix like platform

$ perl -lane '{print if(/MD5_CHECK=/ .. /=\*=\*=\*/)}' FILE
{ID=["1915090201504937"], MD5_CHECK=["8A344523332566EFCBBA1A30CE6A4007"], STATE=["22"], CODE=["T4011003"], PASSWORD=[""], X_RSPCODE=["0000"], X_RSPDESC=["success"], X_RESULTINFO=["success"], X_RESULTCODE=["0"]}

Name           OCC   VALUE
------------------  ----  ------------------------------
ACCEPT_DATE         0     20150902001051
ACCEPT_MONTH        0     9
ACTIONCODE          0     0
ACTION_REASON       0     
......(此处省略N行)
=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*

   

论坛徽章:
0
10 [报告]
发表于 2015-09-03 16:12 |只看该作者
jason680 发表于 2015-09-03 00:01
回复 1# urok

There has a easy way for Unix like platform


在匹配模式里写固定值可以用,但是用传参就有问题:
  1. [/user/xxxx]$cat in.txt
  2. This is line 1
  3. AAAAAA lineA1
  4. BBBBBB lineA2
  5. CCCCCC lineA3
  6. ID=["20150902"]
  7. This is line 6
  8. This is line 7
  9. DDDDD lineB1
  10. =*=*=*
  11. EEEEE lineB2
  12. This is line 11
  13. ID=["20150903"]
  14. This is line 13
  15. =*=*=*
  16. balabalabala
复制代码
  1. #!/bin/sh

  2. ID=20150902
  3. FILE=in.txt
  4. echo "模式:" ID=\[\"$ID
  5. perl -lane '{print if(/ID=\[\"$ID/ .. /=\*/)}' $FILE
  6. echo "结果:" $?
复制代码
  1. $./test.sh
  2. 模式: ID=["20150902
  3. ID=["20150902"]
  4. This is line 6
  5. This is line 7
  6. DDDDD lineB1
  7. =*=*=*
  8. ID=["20150903"]
  9. This is line 13
  10. =*=*=*
  11. 结果: 0
复制代码
把不符合条件的也执行出来了,什么鬼?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP