针对于web日志做分析是学习spark常用练习项目。此文介绍web日志正则匹配相关小提示。
- 实例测试
从网上找了一个access日志案列
218.19.140.242 - - [10/Dec/2010:09:31:17 +0800] "GET /query/trendxml/district/todayreturn/month/2009-12-14/2010-12-09/haizhu_tianhe.xml HTTP/1.1" 200 1933 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 (.NET CLR 3.5.30729)"
下面是spark-shell中测试代码:
val list = """218.19.140.242 - - [10/Dec/2010:09:31:17 +0800] "GET /query/trendxml/district/todayreturn/month/2009-12-14/2010-12-09/haizhu_tianhe.xml HTTP/1.1" 200 1933 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 (.NET CLR 3.5.30729)"""" val logPattern = """^(\S+) (\S+) (\S+) \[([\w/]+)([\w:/]+)\s([+\-]\d{4})\] "(\S+) (\S+) (\S+)" (\d{3}) (\d+) "(\S+)" "(.*?)"$""".r logPattern.findFirstIn(list) match { case Some(logPattern(_*)) => true case _ => false }
输出结果:
Boolean = true
结果报错修改方式,删除部分项目具体测试哪一项正则出问题:
val list = """218.19.140.242 - - [10/Dec/2010:09:31:17 +0800]""" val logPattern = """^(\S+) (\S+) (\S+) \[([\w/]+)([\w:/]+)\s([+\-]\d{4})\]$""".r logPattern.findFirstIn(list) match { case Some(logPattern(_*)) => true case _ => false }
2. web日志格式
将日志进行拆分:
(1)218.19.140.242 //客户端ip
(2)- //标注访问者的标识,-表示空白
(3)- //记录用户HTTP的身份验证
(4)[10/Dec/2010:09:31:17 +0800] //记录请求的时间,+0800表示服务器所处时区为东八区
(5)"GET /query/trendxml/district/todayreturn/month/2009-12-14/2010-12-09/haizhu_tianhe.xml HTTP/1.1" //GET请求,请求的资源路径,协议为HTTP/1.1
(6)200 //状态码
(7)1933 //数据量
(8)"-" //
(9)"Mozilla/5.0 (Windows......." //记录客户端的浏览器信息
3. scala正则匹配
^ 匹配开始
$ 匹配结束
\S+ 匹配任意空白字符
\[([\w/]+)([\w:/]+)\s([+\-]\d{4})\] 匹配时间
\d{3} 匹配三个数字
\d+ 匹配多个数字
惰性匹配(.*?)
1、. 匹配任意除换行符“\n”外的字符;
2、*表示匹配前一个字符0次或无限次;
3、+或*后跟?表示非贪婪匹配,即尽可能少的匹配,如*?重复任意次,但尽可能少重复;
4、 .*? 表示匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。
参考文献:
1.https://www.douban.com/note/325691248/
2.https://www.runoob.com/scala/scala-regular-expressions.html
3.https://blog.csdn.net/qq_37699336/article/details/84981687