免费注册 查看新帖 |

Chinaunix

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

[文本处理] 日志处理中的分隔符问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-07-27 11:05 |只看该作者 |倒序浏览
要处理一个nginx的日志,想要提取出ip和agent,一条记录如下

106.120.173.102 - - [27/Jul/2014:02:00:00 +0800] "GET /hengshui/famous-3060-105.html HTTP/1.1" 301 178 "-" "Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)"

用cut或者awk的话,使用空格符作为分隔符,那么在最后的agent中,如果含有空格,那么就会被截断,不会得到完整的agent的表示,比如上面的"Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)",这个就会被空格截断为几个,不能完整得到,所以想问问,有没有办法指定2种分隔符,碰到哪种分隔符,就以哪种分隔符为主?

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
2 [报告]
发表于 2014-07-27 11:29 |只看该作者
本帖最后由 yestreenstars 于 2014-07-27 11:35 编辑

是这个意思吗?
  1. $ awk -vFPAT='"[^"]+"|[^ ]+' '{print $1,$NF}' i
  2. 106.120.173.102 "Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)"
复制代码
  1. $ perl -pe 's/(\S+).*("[^"]+")/$1 $2/' i
  2. 106.120.173.102 "Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)"
复制代码
  1. $ sed -r 's/(\S+).*("[^"]+")/\1 \2/' i
  2. 106.120.173.102 "Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)"
复制代码

论坛徽章:
0
3 [报告]
发表于 2014-07-27 11:34 |只看该作者
完全正解!又开眼界了,谢谢!回复 2# yestreenstars


   

论坛徽章:
0
4 [报告]
发表于 2014-07-27 11:41 |只看该作者
第一个看懂了,是FPAT的用法,第二个和第三个其实都是一个原理,利用了正则的贪婪特性,很巧妙地把最后一个双引号的域提取出来了,思路很妙!
回复 2# yestreenstars


   

论坛徽章:
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
5 [报告]
发表于 2014-07-27 15:13 |只看该作者
本帖最后由 jason680 于 2014-07-27 15:14 编辑

回复 1# lemoncoral


1. awk using FS(Field Sepator) variable
$ awk -F'- -|"' -vq='"' '{print $1,q$(NF-1)q}' FILE
106.120.173.102  "Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)"

2. awk using match function
$ awk 'match($0,/^([^ ]+) .*("[^"]+")$/,a){print a[1],a[2]}' FILE
106.120.173.102 "Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)"

3. perl
$ perl -lane '{print "$1 $2" if m/^([^ ]+) .*("[^"]+")$/}' FILE
106.120.173.102 "Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)"

论坛徽章:
0
6 [报告]
发表于 2014-07-27 18:01 |只看该作者
awk的另两种思路,更为普适,感谢!回复 5# jason680


   

论坛徽章:
9
寅虎
日期:2013-12-02 12:49:22巨蟹座
日期:2014-07-18 18:13:34卯兔
日期:2014-07-25 14:43:08子鼠
日期:2014-07-26 10:10:51酉鸡
日期:2014-07-31 15:09:562015亚冠之本尤德科
日期:2015-05-19 09:27:382015亚冠之卡尔希纳萨夫
日期:2015-06-20 10:30:212015亚冠之阿尔纳斯尔
日期:2015-07-01 20:46:062015亚冠之城南
日期:2015-07-15 21:12:00
7 [报告]
发表于 2014-07-27 19:15 |只看该作者
  1. test@redmine:~/test2$ cat c.txt
  2. 106.120.173.102 - - [27/Jul/2014:02:00:00 +0800] "GET /hengshui/famous-3060-105.html HTTP/1.1" 301 178 "-" "Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)"
  3. test@redmine:~/test2$ awk 'BEGIN{FS="-|(\" \")"}{printf "%s \"%s\n",$1,$NF}' c.txt
  4. 106.120.173.102  "Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)"
复制代码

论坛徽章:
5
未羊
日期:2014-08-04 16:15:21天秤座
日期:2014-08-13 13:52:372015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:112015亚冠之浦和红钻
日期:2015-06-29 15:30:48
8 [报告]
发表于 2014-07-28 00:03 |只看该作者
  1. awk -F \" '{split($1,a," ");print a[1]" \""$(--NF)"\""}'
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP