通过对awk, wc, uniq, grep, sort等命令的组合,分析nginx的access和error日志。
统计各种总量、单位时间量。
access.log日志格式(见下图)
说明:
a). 按照Tab键拆分每项数据
b). 字段含义(如下说明)
column1:ip_address
column2:log_time
column3:request
column4:status_code
column5:send_bytes
column6:referer
需求一:统计总记录数,总成功数,各种失败数:404,403,500
1. 提取总数
思路:拆分原始文件,找到状态列,按照不同条件值,分别获取总数。
a). 使用awk拆分并提取状态码列,并保证该列值大于0,并使用wc命令计算总行
wc -l 对结果进行汇总
awk使用-F来指定数据项分隔符。一个字符可是直接使用,比如-F:(英文逗号分隔),否则应该使用英文‘’将分隔符括起来,比如
-F'\t'。
b). 添加说明信息
wc -l 的结果作为awk的第一列,所以取$1
2. 提取成功、各种失败总数
a). 200成功总数
在使用awk时,针对变量使用条件执行过滤
b). 404失败总数
c). 403失败总数
d).500失败总数
需求二:各种错误中,哪类URL出现的次数最多,要求剔除重复项,并倒叙给出结果
思路:
1). 拆分获取request和StatusCode
2). 对request再拆分获取真实URL
3). 对URL排序,排重,再计算总数,最后再倒叙给出结果
a). 使用awk得到某类错误(status=500)包含request的中间结果。注意request和status之间使用空格连接
b). 针对中间结果再次使用空格进行拆分,获取request中的URL
当内容默认使用空格或tab来分隔数据项时,使用awk拆分时,不需要使用-F来执行分隔符。
如下面命令中的 awk '{print $2}' 没有使用-F指定分隔符。
c). 排序、去除重复项
使用sort对结果进行默认排序
使用uniq -c去除重复项并给出计数结果
d). 根据图上结果,发现重复的URL会被自动计数,但是计数的结果顺序是随机的。我们需要再次针对结果进行排序,使用sort 中的 -k指定列,并指明要求是按照数字的倒叙
去除重复项后,希望对结果进行倒叙
-k指明使用哪一列进行排序,-k1:表示使用第一列进行排序
n指明排序列为数字
r代表使用倒叙
所以-k1nr 代表:要进行排序的第一列请作为数字看待,并且结果要进行倒叙
注意:在去重前,最好先使用sort对结果进行排序,然后才能顺利合并。
需求三:要统计URL中文件名出现的次数,结果中要包含Code 和 Referer。但是 URL和 Referer中都包含 / 字符,对于过滤有干扰,尝试去解决。
思路:
1). 先拆分获取必要数据
2). 想办法将URL中文件名之前的部分去除
3). 然后再排序等
a). 查看原始文件内容
使用cat命令查看原始文件内容。
b). 获取必要信息
由于是\t分隔各个数据项,所以符合默认拆分,不需要-F指明分隔符
c).将URL中文件名之前的部分剔除,但保留referer中的"/"。
这部分重点:使用了sed命令对URL进行过滤,只保留URL中的文件名部分,其余部分不再要。
本sed命令只对第一列数据进行应用过滤操作。
#.*/\(.* \)#\1#解释:
整个内容被#分成两部分
第一部分(两个#号中间的内容).*/\(.* \),用来匹配URL中的两部分内容
比如URL为:/koubei/2012/11/19/60/abc.jpg (注意最后有一个空格)
.*/用来匹配:"/koubei/2012/11/19/60/"
\(.* \)用来匹配:"abc.jpg "
第二部分
\1,用来匹配第一部分中()中的内容,即 "文件名.扩展名 "
整个命令的含义是:
将URL替换成文件名
即将 "/koubei/2012/11/19/60/abc.jpg "替换成"abc.jpg "
d). 执行排序
注意这里要对第一列先进行排序,否则会影响去重。
e).去重
f).倒叙出结果