免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 11899 | 回复: 89

[文本处理] 截取网址 [复制链接]

论坛徽章:
4
15-16赛季CBA联赛之北控
日期:2016-12-06 11:11:0115-16赛季CBA联赛之广夏
日期:2016-12-06 15:04:1515-16赛季CBA联赛之四川
日期:2016-12-06 15:59:51黑曼巴
日期:2016-12-09 20:24:05
发表于 2016-12-02 16:01 |显示全部楼层
20可用积分
本帖最后由 方兆国儿 于 2016-12-10 10:37 编辑

文本内容如下,约近9000多行,统计后发现格式只有下面这几种:
截取后格式为:.chinaunix.net
保留两个点及之间内容   

目前我的做法是:
  1. 插入代码好几次都没有保存上?CU又怎么了?
复制代码

复制代码
  1. cat a.txt |sort |uniq|egrep -i 'get|post|connect'|cut -d'"' -f2|cut -d' ' -f2|sort|uniq>out.txt
  2. cat out.txt|grep -i '^http'>http.txt
  3. cat out.txt|grep -iv '^http'>nohttp.txt


  4. cat http.txt|cut -d'/' -f3|sort|uniq|awk -F'.' '{print "."$(NF-1)"."$NF}'|sort|uniq>out1.txt
  5. cat nohttp.txt|cut -d':' -f1|awk -F'.' '{print "."$(NF-1)"."$NF}'>out2.txt

  6. cat out1.txt out2.txt >ooxx.txt
  7. cat ooxx.txt|sort|uniq>result.txt
复制代码


我觉得自己写的代码太傻了,请高人指点迷津,能否用sed 直接匹配截取出来,感激涕零!

详情见36楼:http://bbs.chinaunix.net/thread-4256923-4-1.html
最终结果:如下。
  1. #cat domainExtraction.awk
复制代码
  1. #!/usr/bin/awk -f
  2. # Run as gawk
  3. # ./domainExtraction.awk inputFiles
  4. #
  5. BEGIN {
  6.     FS="";
  7.     print "START";
  8. }
  9. {
  10.     match($0,/.*"(GET|POST|CONNECT) (https?:\/\/)?[^/]*((\.[^/:]*){2})/,a);
  11.     if(!b[a[3]]++){
  12.         print a[3];
  13.     }
  14. }
  15. END {
  16.     print "DONE";
  17. }
复制代码



在此,一并感谢下列CUer的帮助与鼓励,排名不分先后:
回复 4# yinyuemi
回复 5# moperyblue
回复 6# sunzhiguolu
回复 56# sditmaner
回复 2# 王楠w_n



于是,我现在陷入艰难的抉择中,究竟选择谁为最终答案?
回复 62# moperyblue
给出了awk的解决方案,而且花费自己的时间和耐心;

回复 64# sunzhiguolu
给出了perl的解决方案,同时帮助我重新认识了regex,意义重大。

选择这个答案之前,我得到了如下回复:
屏幕快照 2016-12-09 下午8.43.49.png

最后,再次感谢大家的帮助。


论坛徽章:
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
发表于 2016-12-02 16:01 |显示全部楼层

  1. awk '{match($0,/.*"(GET|POST|CONNECT) (https?:\/\/)?[^/]*((\.[^/:]*){2})/,a)}!b[a[3]]++{print a[3]}' cu.txt
复制代码

?

论坛徽章:
146
2015年亚洲杯之日本
日期:2015-04-28 13:32:012015年亚洲杯之朝鲜
日期:2015-05-06 10:16:442015年亚洲杯之日本
日期:2015-05-06 10:21:342015年亚洲杯纪念徽章
日期:2015-05-13 17:16:442015亚冠之北京国安
日期:2015-05-13 17:18:292015亚冠之鹿岛鹿角
日期:2015-05-13 17:19:062015亚冠之德黑兰石油
日期:2015-05-27 16:47:402015亚冠之塔什干棉农
日期:2015-05-28 15:24:122015亚冠之卡尔希纳萨夫
日期:2015-06-01 13:52:392015亚冠之柏斯波利斯
日期:2015-06-04 17:37:292015亚冠之阿尔纳斯尔
日期:2015-06-16 11:31:202015亚冠之塔什干火车头
日期:2015-06-23 10:12:33
发表于 2016-12-05 10:12 |显示全部楼层
楼主问题比较急,大家帮忙解决下,多谢

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
发表于 2016-12-05 10:30 |显示全部楼层
输出是什么?

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
发表于 2016-12-05 10:40 |显示全部楼层
回复 1# 方兆国儿

  1. awk 'match($0,/.*"(GET|POST|CONNECT) ([^ ]+)/,a){match(a[2],/.*(\.[^.]+\.(net|com))/,b);if(!c[b[1]]++)print b[1]}' file
复制代码

论坛徽章:
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
发表于 2016-12-05 11:10 |显示全部楼层

  1. awk '$(NF-2)~/get|post|connect/{match($(NF-1),/(http:\/\/)?[^/]*((\.[^/]*){2})[/:].*/,a)}!b[a[2]]++{print a[2]}' IGNORECASE=1 a.txt
复制代码

论坛徽章:
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
发表于 2016-12-05 12:20 |显示全部楼层
  1. perl -ne '{$h{"$1\n"}++ if(/((?>\.\w+){2})(?=:|\/)/)}END{print keys %h}' f
复制代码

论坛徽章:
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
发表于 2016-12-05 12:30 |显示全部楼层
  1. grep -Po '(\.\w+){2}(?=:|\/)' f|sort -u
复制代码

论坛徽章:
4
15-16赛季CBA联赛之北控
日期:2016-12-06 11:11:0115-16赛季CBA联赛之广夏
日期:2016-12-06 15:04:1515-16赛季CBA联赛之四川
日期:2016-12-06 15:59:51黑曼巴
日期:2016-12-09 20:24:05
发表于 2016-12-05 21:55 |显示全部楼层
本帖最后由 方兆国儿 于 2016-12-05 22:19 编辑

回复 4# yinyuemi

首先,感谢您的回复。
然后,执行后结果存在问题。
屏幕快照 2016-12-05 下午9.49.16.png

第一:只抓 .net .com 是不可以的,因为包括了全球所有domain
第二:如图中问题,因为并非是每一行只有3个点,有的是4个、5个、6个也有的,甚至更多
第三:是我自己的问题,强调一下要用gawk

屏幕快照 2016-12-05 下午10.18.41.png
最后,多谢了。
截图出处,附件148页: Effective_awk_Programming_3rd.pdf (3.33 MB, 下载次数: 31)

论坛徽章:
4
15-16赛季CBA联赛之北控
日期:2016-12-06 11:11:0115-16赛季CBA联赛之广夏
日期:2016-12-06 15:04:1515-16赛季CBA联赛之四川
日期:2016-12-06 15:59:51黑曼巴
日期:2016-12-09 20:24:05
发表于 2016-12-05 22:07 |显示全部楼层
回复 5# moperyblue

同时,也感谢您的回复。
测试结果显示,
数据存在缺漏(计算结果显示,与我计算的相差80多行)及错误(比如空行)
缺漏:看到您仅仅匹配http,以至于丢掉了非http开头的domain,以至于此。

最后,多谢您的指教。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP