免费注册 查看新帖 |

Chinaunix

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

[文本处理] shell下做字符比对输出 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-08-24 11:34 |只看该作者 |倒序浏览
请群里大神帮帮忙,能否帮我解决一下这个问题:

我要往数据库里LOAD数据,所以需要从日志文件里解析jSON格式的:
{"data":[{"position":"-1","screen":"720*1184","networkType":"WIFI","phone_number":"2222222","packageName":"aaa","channelId":"111","imei":"000","IP":"1.1.1.1","UUID":"ccc","versionCode":"20150720","mac":"00:00:00:00:00:00","agent":"infocus InFocus M310","simcardType":"ddd","linkId":"","actionDate":"2015-08-19 00:14:02","hasSDCard":"1","userId":"","name":"","sim":"33333333333","mobileOS":"4.2.2","logType":"000","resType":"-1"}]}|20150819001404|444444444
我需要的是-1,720*1184,WIFI,222222等值插入数据库数据库里对应的字段就是position,screen,networkType,phone_numbe这些,一开始我使用awk -F'"' '{for(i=6;i<=90;i=i+4) printf $i"#";printf "\n"命令将所需的值提取出来,用#号分割。但是后来发现生产的日志中有些日志缺少KEY值,就是有可能会缺少mac,sim的键值,这样用我的命令分割出来的数据中间就可能少一个,造成插入数据库的数据错位了,现在我想做的事情是,将数据库里所需要的字段与日志匹配,如果有这个字段就输出对应的值,如果没有则输出一个空值,这样保证插入的数据列数是一样的
  


请哪位大神帮帮忙给个解决办法啥的,不胜感激

论坛徽章:
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
2 [报告]
发表于 2015-08-24 11:38 |只看该作者
这东西用 shell 做真不是什么好的选择.

论坛徽章:
0
3 [报告]
发表于 2015-08-24 11:47 |只看该作者
我当时的思路是用一个数组存所有的字段,然后用AWK分割出日志后,用数组里的值与取出的值匹配,如果相同就输出$i+2的值,如果不匹配就输出#,但是AWK命令我不太熟悉,不知道怎么把这个值和数组里面的值比较回复 2# MMMIX


   

论坛徽章:
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-08-24 13:03 |只看该作者
awk -F'[,{[]' '{for(i=1;i<=NF;i++){split($i,a,":"); if(a[1]~"position") b[NR][1]=a[2];if(a[1]~"screen") b[NR][2]=a[2];if(a[1]~"networkType") b[NR][3]=a[2];if(a[1]~"phone_numbe") b[NR][4]=a[2]}}END{for(m=1;m<=NR;m++){for(n=1;n<=4;n++) printf b[m][n]"#";print ""}}' test.dat

论坛徽章:
0
5 [报告]
发表于 2015-08-24 14:02 |只看该作者
好像不行回复 4# tuyajie


   

论坛徽章:
16
CU十二周年纪念徽章
日期:2013-10-24 15:41:3415-16赛季CBA联赛之广东
日期:2015-12-23 21:21:55青铜圣斗士
日期:2015-12-05 10:35:30黄金圣斗士
日期:2015-11-26 20:42:16神斗士
日期:2015-11-19 12:47:50每日论坛发贴之星
日期:2015-11-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-18 06:20:002015亚冠之城南
日期:2015-11-10 19:10:492015亚冠之萨济拖拉机
日期:2015-10-28 18:47:282015亚冠之柏太阳神
日期:2015-08-30 17:21:492015亚冠之山东鲁能
日期:2015-07-07 18:48:39摩羯座
日期:2014-08-29 23:01:42
6 [报告]
发表于 2015-08-24 14:14 |只看该作者
  1. awk -vRS='\\[\\{|\\}\\]' -F ',' '/position/{ for (i=1;i<NF;i++)print $i;}' data.txt      
  2. "position":"-1"
  3. "screen":"720*1184"
  4. "networkType":"WIFI"
  5. "phone_number":"2222222"
  6. "packageName":"aaa"
  7. "channelId":"111"
  8. "imei":"000"
  9. "IP":"1.1.1.1"
  10. "UUID":"ccc"
  11. "versionCode":"20150720"
  12. "mac":"00:00:00:00:00:00"
  13. "agent":"infocusInFocus M310"
  14. "simcardType":"ddd"
  15. "linkId":""
  16. "actionDate":"2015-08-19:00:14:02"
  17. "hasSDCard":"1"
  18. "userId":""
  19. "name":""
  20. "sim":"33333333333"
  21. "mobileOS":"4.2.2"
  22. "logType":"000"
复制代码

论坛徽章:
16
CU十二周年纪念徽章
日期:2013-10-24 15:41:3415-16赛季CBA联赛之广东
日期:2015-12-23 21:21:55青铜圣斗士
日期:2015-12-05 10:35:30黄金圣斗士
日期:2015-11-26 20:42:16神斗士
日期:2015-11-19 12:47:50每日论坛发贴之星
日期:2015-11-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-18 06:20:002015亚冠之城南
日期:2015-11-10 19:10:492015亚冠之萨济拖拉机
日期:2015-10-28 18:47:282015亚冠之柏太阳神
日期:2015-08-30 17:21:492015亚冠之山东鲁能
日期:2015-07-07 18:48:39摩羯座
日期:2014-08-29 23:01:42
7 [报告]
发表于 2015-08-24 14:49 |只看该作者
  1. awk -vRS='\\[\\{|\\}\\]' -F ',' '/position/{ for (i=1;i<NF;i++){ split($i,aa,":");print aa[1],aa[2] } }' data.txt
  2. "position" "-1"
  3. "screen" "720*1184"
  4. "networkType" "WIFI"
  5. "phone_number" "2222222"
  6. "packageName" "aaa"
  7. "channelId" "111"
  8. "imei" "000"
  9. "IP" "1.1.1.1"
  10. "UUID" "ccc"
  11. "versionCode" "20150720"
  12. "mac" "00
  13. "agent" "infocusInFocus M310"
  14. "simcardType" "ddd"
  15. "linkId" ""
  16. "actionDate" "2015-08-19
  17. "hasSDCard" "1"
  18. "userId" ""
  19. "name" ""
  20. "sim" "33333333333"
  21. "mobileOS" "4.2.2"
  22. "logType" "000"
复制代码

论坛徽章:
11
射手座
日期:2015-08-11 16:10:26辰龙
日期:2015-08-11 16:11:11黑曼巴
日期:2016-04-26 16:58:40
8 [报告]
发表于 2015-08-24 15:18 |只看该作者
本帖最后由 hjfeng1988 于 2015-08-24 17:12 编辑

回复 9# baolei161
  1. [root@66a awk]# cat file
  2. "a":"1","b":"2","c":"3","d":"4","e":"5"
  3. "a":"1","b":"2","d":"4"
  4. "a":"1","b":"2","d":"4","e":"5"
  5. "a":"1","b":"2","c":"3","d":"4"
  6. [root@66a awk]# awk -F ',' -vx='c":"0","' -vy=',"e":"0"' '!/"c"/{sub(/d/,x)}!/"e"/{sub(/$/,y)}{for(i=1;i<=NF;i++){split($i,a,"\"");printf a[4]}print ""}' file
  7. 12345
  8. 12040
  9. 12045
  10. 12340
  11. [root@66a awk]#
复制代码

论坛徽章:
0
9 [报告]
发表于 2015-08-24 15:27 |只看该作者
貌似后面的几位大神没理解我的需求,比如 我现在数据库里有 a b c d e 共五个字段,在log中会有对应的值 a:1 b:2 c:3 d:4 e:5,但是由于客户端的LOG在记录的时候如果该字段没有获取到值的话会自动把这个KEY不记录,所以日志可能变成 a:1 b:2 d:4 这种,那么我现在的需求是我取的值必须是5个,如果发现没有则需要补一个空值,比如a:1 b:2 c:null d:4 e:null ,这样保证我loaddata进数据库的数据不会错

论坛徽章:
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
10 [报告]
发表于 2015-08-24 15:48 |只看该作者
本帖最后由 tuyajie 于 2015-08-24 15:49 编辑

  1. 我自己伪造的文件,第一行是没有phone_number关键字
  2. [jay.liu@aliCloud chinaUnix]$ cat test.dat
  3. {"data":[{"position":"-1","screen":"720*1184","networkType":"WIFI","packageName":"aaa","channelId":"111","imei":"000","IP":"1.1.1.1","UUID":"ccc","versionCode":"20150720","mac":"00:00:00:00:00:00","agent":"infocus InFocus M310","simcardType":"ddd","linkId":"","actionDate":"2015-08-19 00:14:02","hasSDCard":"1","userId":"","name":"","sim":"33333333333","mobileOS":"4.2.2","logType":"000","resType":"-1"}]}|20150819001404|444444444
  4. {"data":[{"position":"-1","screen":"720*1184","networkType":"WIFI","phone_number":"2222222","packageName":"aaa","channelId":"111","imei":"000","IP":"1.1.1.1","UUID":"ccc","versionCode":"20150720","mac":"00:00:00:00:00:00","agent":"infocus InFocus M310","simcardType":"ddd","linkId":"","actionDate":"2015-08-19 00:14:02","hasSDCard":"1","userId":"","name":"","sim":"33333333333","mobileOS":"4.2.2","logType":"000","resType":"-1"}]}|20150819001404|444444444
  5. {"data":[{"position":"-1","screen":"720*1184","networkType":"WIFI","phone_number":"2222222","packageName":"aaa","channelId":"111","imei":"000","IP":"1.1.1.1","UUID":"ccc","versionCode":"20150720","mac":"00:00:00:00:00:00","agent":"infocus InFocus M310","simcardType":"ddd","linkId":"","actionDate":"2015-08-19 00:14:02","hasSDCard":"1","userId":"","name":"","sim":"33333333333","mobileOS":"4.2.2","logType":"000","resType":"-1"}]}|20150819001404|444444444



  6. [jay.liu@aliCloud chinaUnix]$ awk -F'[,{[]' '{for(i=1;i<=NF;i++){split($i,a,":"); if(a[1]~"position") b[NR][1]=a[2];if(a[1]~"screen") b[NR][2]=a[2];if(a[1]~"networkType") b[NR][3]=a[2];if(a[1]~"phone_numbe") b[NR][4]=a[2]}}END{for(m=1;m<=NR;m++){for(n=1;n<=4;n++) printf b[m][n]"#";print ""}}' test.dat
  7. "-1"#"720*1184"#"WIFI"##
  8. "-1"#"720*1184"#"WIFI"#"2222222"#
  9. "-1"#"720*1184"#"WIFI"#"2222222"#
复制代码
回复 5# baolei161

这个是不是你要的啊?你那里抱了什么错?


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP