linux下使用awk,wc,sort,uniq,grep对nginx日志进行分析和统计

通过对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).倒叙出结果

你可能感兴趣的:(linux,命令)