我有以下日志文件:
/veratt/po/dashboard.do
/veratt/po/dashboardfilter.do?view=R
/veratt/po/leaseagent.do?view=R
/veratt/po/dashboardfilter.do?&=R&=E&propcode=0&display=0&rateType=0&floorplan=&=Display&format=4&action=getReport
/veratt/po/leaseagent.do
/veratt/po/leaseagent.do?view=V
每个HTTP请求的Count的所需AWK输出(减去请求参数)**
/veratt/po/dashboard.do - 1
/veratt/po/leaseagent.do - 3
/veratt/po//veratt/po/dashboardfilter.do - 2
我知道使用数组的基本AWK命令 - 但是所需的输出与我需要的完全不同。
awk '{a[$2]=a[$2]+1;} END {for( item in a) print item , a[item];} '
答案 0 :(得分:1)
awk -F\? '{ count[$1]++}
END { for (item in count)
printf("%s - %d\n", item, count[item]) }' logfile
-F
:?
字符上的单独字段,因此$1
是请求;它有$2
中的URL参数,我们忽略它们的存在。注意:可以使用BEGIN { FS="?" }
完成。注意:如果FS
不止一个字符,则将其视为正则表达式。{ count[$1]++ }
:对于每一行,计算$1
的出现次数。END
:在处理所有输入结束时运行此块for (item in count)
:在item
数组中的键上重复count
变量。printf("%s - %d\n", item, count[item])
:格式化项目及其计数的打印,用空格划分。注意:%d
可以替换为%s
; awk是弱类型的。答案 1 :(得分:0)
的test.txt
/veratt/po/dashboard.do
/veratt/po/dashboardfilter.do?view=R
/veratt/po/leaseagent.do?view=R
/veratt/po/dashboardfilter.do?&=R&=E&propcode=0&display=0&rateType=0&floorplan=&=Display&format=4&action=getReport
/veratt/po/leaseagent.do
/veratt/po/leaseagent.do?view=V
命令:
awk 'BEGIN{FS="?"} {a[$1]++} END{for(i in a) print i, a[i]}' test.txt
输出:
/veratt/po/leaseagent.do 3
/veratt/po/dashboard.do 1
/veratt/po/dashboardfilter.do 2
解释
BEGIN{FS="?"}
设置?要成为字段分隔符,所以$ 1将是第一个之前的子字符串?这只在test.txt的进程内容之前运行一次
{a[$1]++}
创建一个数组,index是子字符串,使其自动递增。
END{for(i in a) print i, a[i]}
迭代数组,检查其索引和相应的值,END块在test.txt的所有行处理后运行一次。