免费注册 查看新帖 |

Chinaunix

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

关于利用正则表达式取值得问题,很变态。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-01 14:26 |只看该作者 |正序浏览
一个文本中大概有这样类型的三句话,
I emcmk01v emcmk01v                                emunk01v:sjPEX_pxd 08-07-16 00:05:18 !PEX001 ジョブ状況通知  [起動](日付:20080715,システム:EM_SYS,フレーム:EMCMKF01,ネット:EMBHN100,ジョブ:EMBH120D,ノード:emcmk01v,起動コマンド:SUBSENJU EM A)
I emunk01v emunk01v                                emunk01v:sjPEX_pxd 08-07-16 00:00:00 !PEX021 ネット状況通知  [起動](日付:20080715,システム:EM_SYS,フレーム:EMODBF01,ネット:EMOXN210)
I emunk01v emunk01v                                emunk01v:sjPEX_pxd 08-07-16 02:30:07 !PEX041 フレーム状況通知[起動](日付:20080715,システム:EM_SYS,フレーム:EURBFOL)
现在要把其中的(日付:20080715,システム:EM_SYS,フレーム:EMCMKF01,ネット:EMBHN100,ジョブ:EMBH120D,ノード:emcmk01v,起動コマンド:SUBSENJU EM A)
EM_SYS EMCMKF01 EMBHN100 EMBH120D
取出来,并且按照上边的格式输出到output.log中,如果没有的话就显示-,但是因为系统不支持日文,所以不能根据[日付:][システム:][フレーム:][ジョブ]这几个关键字来找到EM_SYS EMCMKF01 EMBHN100 EMBH120D 这几个值,那应该怎么办呢

论坛徽章:
0
14 [报告]
发表于 2008-08-01 18:34 |只看该作者
grep -o ':E[_a-zA-Z0-9]*,'
不知道LZ要的是不是这个。还是要再处理一下?

论坛徽章:
0
13 [报告]
发表于 2008-08-01 18:20 |只看该作者
你是真正的高手!!!!

不敢当,我仅是一个shell刚入门者
能不能小小的讲解下,比如[()]是匹配什么?

[()]是[...]正则表达式,匹配‘(’或‘)’

论坛徽章:
0
12 [报告]
发表于 2008-08-01 17:39 |只看该作者
原帖由 爱知 于 2008-8-1 17:37 发表
复杂了点:

sed 's/[()]/|/g' urfile |awk -F'|' '{print $2}'|awk -F','{for(n=2;n



你是真正的高手!!!!
能不能小小的讲解下,比如[()]是匹配什么?

论坛徽章:
0
11 [报告]
发表于 2008-08-01 17:37 |只看该作者
当我们束手无策的时候,暴力是唯一的解决途径!
sed -i 's/[^a-zA-Z0-9]/ /g' txt
勇敢的少年,拿起你心爱的awk,去拯救世界吧!

[ 本帖最后由 shijiu 于 2008-8-1 17:44 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2008-08-01 17:37 |只看该作者
复杂了点:

  1. sed 's/[()]/|/g' urfile |awk -F'|' '{print $2}'|awk -F',' '
  2. {
  3. for(n=2;n<6;n++)
  4. {
  5.   if( $n ~ /.*EM_SYS/)
  6.      {prit $n;continue;}
  7.   else
  8.      {print "--------"}
  9.   if($n ~ /.*EMCMKF01/)
  10.      {print $n;continue;}
  11.   else
  12.     {print "--------"}
  13.   if($n ~ /.*EMBHN100/)
  14.      {print $n;continue;}
  15.   else
  16.      {print "--------"}
  17.   if($n ~ /.*EMBH120D/)
  18.      {print $n;continue;}
  19.   else
  20.      {print "--------"}
  21. }
  22. }'
复制代码

[ 本帖最后由 爱知 于 2008-8-1 18:50 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2008-08-01 16:54 |只看该作者
原帖由 shijiu 于 2008-8-1 16:29 发表
观察了一下,数据是固定格式,可以用获取字符串的方式获得需要的数据
大概写了个,没法测试- -.
awk '{print substr($0,141,6),substr($0,158,,substr($0,174,,substr($0,190,}'

我打小数数不及格, ...


数据并不是固定的格式,因为太多,我只摘取了一部分.

我的想法是用,分割出几个部分,然后对每个部分进行处理
比如说

第一部分
I emcmk01v emcmk01v                                emunk01v:sjPEX_pxd 08-07-16 00:05:18 !PEX001 ジョブ状況通知  [起動](日付:20080715,
第二部分
システム:EM_SYS,
第三部分
フレーム:EMCMKF01,
等等

是不是就可以了
只是有这个想法,还没有去实现呢。

论坛徽章:
0
8 [报告]
发表于 2008-08-01 16:33 |只看该作者
那个日文确实很变态,在vi里都不能复制的说....

论坛徽章:
0
7 [报告]
发表于 2008-08-01 16:29 |只看该作者
观察了一下,数据是固定格式,可以用获取字符串的方式获得需要的数据
大概写了个,没法测试- -.
awk '{print substr($0,141,6),substr($0,158,,substr($0,174,,substr($0,190,}'

我打小数数不及格,拿错字符的话自己改改。

论坛徽章:
0
6 [报告]
发表于 2008-08-01 15:43 |只看该作者
就是说我想把
I emcmk01v emcmk01v                                emunk01v:sjPEX_pxd 08-07-16 00:05:18 !PEX001 ジョブ状況通知  [起動](日付:20080715,システム:EM_SYS,フレーム:EMCMKF01,ネット:EMBHN100,ジョブ: EMBH120D,ノード:emcmk01v,起動コマンド:SUBSENJU EM A)
这一行里的 EM_SYS,EMCMKF01,EMBHN100,EMBH120D取出来,但是正则表达式不能根据前面的日文写,比如说システム:フレーム:ネット:ジョブ: 等等。
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP