快速处理apache日志

kon*_*onr 6 apache awk large-data-volumes

我目前正在运行一个awk脚本来处理一个大的(8.1GB)访问日志文件,它需要永远完成.在20分钟内,它写了14MB的(1000 + - 500)MB我期望它写的,我想知道我是否能以某种方式更快地处理它.

这是awk脚本:

#!/bin/bash

awk '{t=$4" "$5; gsub("[\[\]\/]"," ",t); sub(":"," ",t);printf("%s,",$1);system("date -d \""t"\" +%s");}' $1

编辑:

对于非awkers,脚本读取每一行,获取日期信息,将其修改为实用程序date识别的格式,并将其调用以将日期表示为自1970年以来的秒数,最后将其作为.csv文件的行返回,以及知识产权.

输入示例: 189.5.56.113 - - [22/Jan/2010:05:54:55 +0100]"GET(...)"

退货产出: 189.5.56.113,124237889

gho*_*g74 12

@OP,你的脚本很慢,主要是因为系统日期命令对文件中的每一行都过度调用,而且它也是一个大文件(在GB中).如果您有gawk,请使用其内部mktime()命令将日期转换为纪元秒转换

awk 'BEGIN{
   m=split("Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec",d,"|")
   for(o=1;o<=m;o++){
      date[d[o]]=sprintf("%02d",o)
    }
}
{
    gsub(/\[/,"",$4); gsub(":","/",$4); gsub(/\]/,"",$5)
    n=split($4, DATE,"/")
    day=DATE[1]
    mth=DATE[2]
    year=DATE[3]
    hr=DATE[4]
    min=DATE[5]
    sec=DATE[6]
    MKTIME= mktime(year" "date[mth]" "day" "hr" "min" "sec)
    print $1,MKTIME

}' file
Run Code Online (Sandbox Code Playgroud)

产量

$ more file
189.5.56.113 - - [22/Jan/2010:05:54:55 +0100] "GET (...)"
$ ./shell.sh    
189.5.56.113 1264110895
Run Code Online (Sandbox Code Playgroud)