免费注册 查看新帖 |

Chinaunix

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

从文件里抓取字段再生成指定格式的新文件,shell如何写 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-13 22:52 |只看该作者 |倒序浏览
我的ldap数据格式如下:
dn: loginName=232356,o=commonUser,l=xm-broadman,dc=zmkun,dc=com
objectClass: top
objectClass: customer
category: Residential
cn:: 5p+v546J5Y2/
customerStatus: Active
loginName: 232356
userPassword:: e0NSWVBUfWE4R2k4S0Nid0VwNmM=

dn: serviceCode=VOD0001,loginName=232356,o=commonUser,l=xm-broadman,dc=zmkun,dc=com
objectClass: top
objectClass: subscription
endDate: 201612311010Z
profile: 1024kVOD
serviceCode: VOD0001
serviceStatus: Active
startDate: 200709111631Z

dn: serviceCode=Internet,loginName=tianxiangyun,o=commonUser,l=xm-broadman,dc=zmkun,dc=com
objectClass: top
objectClass: subscription
endDate: 201612311010Z
profile: 1024kInternet
serviceCode: Internet
serviceStatus: Active
startDate: 200806211326Z

我现在想得到loginName后面的用户名如:232356,tianxiangyun(若有多个匹配,只取一个)
从得到的用户名生成如下格式的文件:
232356@zmkun.com  232356/
tianxiangyun@zmkun.com  tianxiangyun/

中间空格或者TAB都可以

希望兄弟们帮忙一下,有点小急,简单的sed会一点点,这个对偶来说难度有点小大了

论坛徽章:
0
2 [报告]
发表于 2008-08-13 23:26 |只看该作者
sed -n '/loginName/s/.*loginName=\([^,]*\),.*,dc=\([^,]*\),dc=\(.*\)/\1@\2.\3\t\1\//p' urfile

论坛徽章:
0
3 [报告]
发表于 2008-08-14 00:30 |只看该作者
原帖由 爱知 于 2008-8-13 23:26 发表
sed -n '/loginName/s/.*loginName=\([^,]*\),.*,dc=\([^,]*\),dc=\(.*\)/\1@\2.\3\t\1\//p' urfile


兄弟,PFPF,太强了,不过有点小出入,相信对你来说是小问题:
偶想要的结果如下:
232356@zmkun.com  232356/
tianxiangyun@zmkun.com  tianxiangyun/

其中:
1、@zmkun.com跟上面的dc=zmkun,dc=com没有关系,@zmkun.com已经固定好了,如也可以换成@test.com,这个相信来说应该更简单
2、你的那个脚本中间没有空格
3、你的那个脚本会产生重复的用户名,偶就想要第一个即可

帮忙一下
不过兄弟很强,上面这个脚本偶看了资料再看它都有点晕,还是看不太懂,所以还是请你再帮忙一下

论坛徽章:
11
金牛座
日期:2015-03-19 16:56:22数据库技术版块每日发帖之星
日期:2016-08-02 06:20:00数据库技术版块每日发帖之星
日期:2016-04-24 06:20:00数据库技术版块每日发帖之星
日期:2016-04-13 06:20:00IT运维版块每日发帖之星
日期:2016-04-13 06:20:00数据库技术版块每日发帖之星
日期:2016-02-03 06:20:00数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00季节之章:春
日期:2015-03-27 15:54:57羊年新春福章
日期:2015-03-27 15:54:37戌狗
日期:2015-03-19 16:56:41数据库技术版块每日发帖之星
日期:2016-08-18 06:20:00
4 [报告]
发表于 2008-08-14 00:47 |只看该作者

回复 #3 zmkun 的帖子

那就更简单了~~
sed -n '/loginName/s#.*loginName=\([^,]*\),.*#\1@zmkun.com \1/#p' urfile

论坛徽章:
0
5 [报告]
发表于 2008-08-14 01:29 |只看该作者
根据二楼兄弟的指点,查了好多资料,参考了很多例子,大概写出来下面这个符合要求的脚本:
sed -n '/loginName/s/.*loginName=\([^,]*\),.*/\1@\test.\com\  \1\//p' 2008-08-13.ldif | awk '{if ($0!=line) print;line=$0}'
不用awk,用sort -u也可以
只是偶还有点疑问:
1、能不能直接用sed搞定呢?跟用awk或者sort -u(速度比较慢)产生的结果有什么区别呢?顺序不管
2、空格的产生我是直接在两个/  /之间直接敲上去了,会有什么问题吗,是否有别的方式来表示空格?TAB键怎么表示?

另外,得处进尺一下:
如1楼的ldap数据例子所示,每一部分都是由两个空格分隔着,而我只想要serviceStatus: Active那一部分的用户,如何去做

希望各位指点一下

[ 本帖最后由 zmkun 于 2008-8-14 01:48 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2008-08-14 08:49 |只看该作者

  1. awk 'BEGIN{RS="";FS="[=,:]"}/serviceStatus: Active/{for(i=1;i<=NF;i++) if($i=="loginName"){a[$(i+1)]=1;break}}END{for(i in a) printf "%s@zmkun.com %s/\n",i,i}' 数据文件
复制代码


如果用sed处理的话,需要排重(就需要用sort来处理),用awk直接处理就可以了(使用数组,直接就可以排重了)。

[ 本帖最后由 springwind426 于 2008-8-14 08:54 编辑 ]

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
7 [报告]
发表于 2008-08-14 09:37 |只看该作者

回复 #1 zmkun 的帖子

练习:

  1. $ awk 'BEGIN{RS="";FS=",?loginName=|,"} !a[$2] {a[$2]=1}END{for(i in a) printf("%s@zmkun.com %s/\n",i,i)}' urfile
复制代码

[ 本帖最后由 blackold 于 2008-8-14 09:39 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2008-08-15 22:58 |只看该作者
再请教一下大家:
如果我想要输出的格式如下:
232356@zmkun.com    2/232356/
tianxiangyun@zmkun.com    t/tianxiangyun/

即前面再加上一个首字符跟/

如何写呢

论坛徽章:
11
金牛座
日期:2015-03-19 16:56:22数据库技术版块每日发帖之星
日期:2016-08-02 06:20:00数据库技术版块每日发帖之星
日期:2016-04-24 06:20:00数据库技术版块每日发帖之星
日期:2016-04-13 06:20:00IT运维版块每日发帖之星
日期:2016-04-13 06:20:00数据库技术版块每日发帖之星
日期:2016-02-03 06:20:00数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00季节之章:春
日期:2015-03-27 15:54:57羊年新春福章
日期:2015-03-27 15:54:37戌狗
日期:2015-03-19 16:56:41数据库技术版块每日发帖之星
日期:2016-08-18 06:20:00
9 [报告]
发表于 2008-08-15 23:06 |只看该作者
sed -n '/loginName/s#.*loginName=\([^,]*\),.*#\1@zmkun.com \1/#p' urfile | awk '{print $1,substr($2,1,1)"/"$2}'

论坛徽章:
0
10 [报告]
发表于 2008-08-16 00:45 |只看该作者

  1. awk 'BEGIN{RS="";FS="[=,:]"}/serviceStatus: Active/{for(i=1;i<=NF;i++) if($i=="loginName"){a[$(i+1)]=1;break}}END{for(i in a) printf "%s@zmkun.com %s/%s/\n",i,substr(i,1,1),i}' 数据文件
复制代码

[ 本帖最后由 springwind426 于 2008-8-17 16:16 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP