使用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
=$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
=$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 导出
完毕。