awk group-by在列的子字符串上

时间:2014-06-05 20:47:18

标签: awk

我有以下日志文​​件:

/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];} ' 

2 个答案:

答案 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的所有行处理后运行一次。