学习笔记:利用awk分析大型WEB日志 //待完善

(一) 对于大型WEB日志(比如8G),可以用awk编程分析日志,满足自己的特别需求(awk适合标准输入,再标准输出的分析编程):
如8G日志:

WEB日志示例

WEB日志一般格式比较标准,适合awk来抽取需要的部分字段。
可先将WEB日志中需要的字段抽取出来,存入一个文件中,比如我抽取第一列( 1)( 3):请求站点,倒数第三列( 10)访( 11):该次请求状态(200表示OK),倒数最后一列($12):该次请求花费时间。
利用awk命令:

awk -F '\t' '{split($1, access_time, " "); split($3, access_url, "?"); print access_time[1] "\t" access_url[1]  "\t" $12 "\t" $10 "\t" $11 ;}' access_log.20150907 > product_log_step1.res

分析:先得到几百M的文件再说,为了方便,否则每次针对8G的文件来运行很头疼。。源文件是access_log.20150907,根据 ‘\t’ 分割后源文件每一行得到12小块,再根据需要获取 1, 3, 10, 11, 12, 1,$3再根据自己的需求split掉多余的部分,最后保存在服务器上同目录下的product_log_step1.res文件(文件自己命名,也可以.txt格式)
product_log_step1.res文件如下:

product_log_step1.res文件内容

再根据自己的需求,比如统计请求正常的次数,5分钟内每秒请求次数,等等。。。
比如需求:
1、每5分钟内,平均每秒请求次数(共24小时,总请求一千万次左右)
2、请求状态正常次数,非正常次数
3、0-1秒内请求次数,1-2秒请求次数,2-3秒请求次数,3-4秒请求次数,4-5秒请求次数,大于5秒请求次数

生成文件:

这里写图片描述
这里写图片描述

代码如下:

awk -F "\t" '

function getHours(times){
    split (times, t, ":");
    return int(t[2]);
}
function getMinutes(times){
    split (times, t, ":");
    return int(t[3]);
}

BEGIN{
    for (i = 0; i < 24; i++){
        for (j = 0; j < 12; j++){
            request[i,j] = 0;
        }
    }

    for(k=0; k<2; k++){
        request_state[k] = 0;
    }

    for(k=0; k<6; k++){
        request_time[k] = 0;
    }

}
{
    h = getHours($1);
    min = int(getMinutes($1)/5);
    request[h,min] +=1;

    if($5=="200"){
        request_state[0] +=1;
    }else{
        request_state[1] +=1;
    }

    if($3>"0" && $3<="1"){
        request_time[0] +=1;
    }else if($3>1 && $3<=2){   
        request_time[1] +=1;
    }else if($3>2 && $3<=3){
        request_time[2] +=1;
    }else if($3>3 && $3<=4){
        request_time[3] +=1;
    }else if($3>4 && $3<=5){
        request_time[4] +=1;
    }else{
        request_time[5] +=1;
    }

}
END{
    printf("\nthe Parsing of Product Page Log:\n\n");
    printf("time \t request_count_5min\n");

    for (i=0; i < 24; i++){
        for(j=0; j<12; j++){
            printf("%s:%s\t\t%f\n",i,j*5,request[i,j]/300);
        }
    }

    printf("OK \t\t NOT_OK\n");
    printf("%s \t %s\n",request_state[0],request_state[1]);

    printf(" (0s-1s)\t (1s-2s)\t (2s-3s)\t (3s-4s)\t  (4s-5s)\t (>5s)\n");
    printf("%s\t\t %s\t\t %s\t\t %s\t\t %s\t\t %s\n",request_time[0],request_time[1],request_time[2],request_time[3],request_time[4],request_time[5]);

}
' product_log.res > product_page_log.txt

只要按照awk语言格式编写就行,格式如下:

这里写图片描述

然后根据业务逻辑把需要的数据的数据抽取出来,保存在一个文件中吧,比如代码中的product_page_log.txt文件,源文件是product_log.res。

(二) awk,sed,grep,sort,uniq,wc,split,tail,less 命令

(待完善)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值