/ 中存储网

Linux系统中使用AWK命令提取出Apache日志中的GET参数数据

2014-02-07 08:10:01 来源:IT技术网

使用awk提取apache日志的GET数据

最近开始用awk写脚本...以下是处女座,发上来纪念下。呵呵。也省得以后要用找不到。

分析要求

1 analysis-need.php 的数据

2 1 数据的如下GET参数{pa1,pa2,pa3}的数值

3 在得到2 的结果后,按如下格式输出

{时间,pa1,pa2,pa3}

注:pa1,pa2,pa3的顺序不一致

awk的脚本如下

awk -F "?" '/GET /analysis-need.php/{print$1, $2}' awk_test.log |awk -F "HTTP/" '{print $1}'|awk '{gsub("&"," "); gsub(""GET /analysis-need.php",""); gsub("]",""); print}'| awk -F "[" '{print $2}' | awk '{ORS =","; print $1; i=3; get_p["doanalysis"]=1; while(i<NF){str =$i;split($i,tr,"=");get_p[tr[1]]=tr[2];i++}; print get_p["pa1"];print get_p["pa2"];print get_p["pa3"]; print "n" }' >> ${ANALYSIS_HOME}cuid_action.log

说明

a 获取来自“analysis-need.php”的数据行,这里假定apache的日志文件为“awk_test.log ”

awk -F "?" '/GET /b.php/{print$1, $2}' awk_test.log

-------------------------------------------------------

b 梳理a中得到的数据,删除GET的&标记,时间的右标记,便于分析(左标记保留)

awk -F "HTTP/" '{print $1}'|awk '{gsub("&"," "); gsub(""GET /analysis-need.php",""); gsub("]",""); print}'

-------------------------------------------------------

c 梳理c中得到的数据,删除时间的右标记(a,b,c三步可以合并,只是为了练手,懒了把)

awk -F "[" '{print $2}'

-------------------------------------------------------

d

下面是重点

awk '{ORS =","; print $1; i=3; get_p["doanalysis"]=1; while(i<NF){str =$i;split($i,tr,"=");get_p[tr[1]]=tr[2];i++}; print get_p["pa1"];print get_p["pa2"];print get_p["pa3"]; print "n" }'

思路如下:

1 建立记录分隔符",",方便作为csv数据处理,因为默认是“n”。

2 使用NF,对每一个 "key=value"的记录段进行分析

3 将分析出的key和value使用awk的数组方式保存(key:get的参数名字;value:get的参数的值)

4 根据分析要求打印符合条件的key的value----这步以后可以按照分析的要求随时增加

5 导出

完毕。