根据服务器日志信息,用shell命令来统计用户对不同网站域名的访问次数并排序。
shell命令从记录中可以收集信息,并统计计数的有uniq 、数组等,在此我们采用awk的关系数组来对日志中的不同的网站域名做计数。数组在awk中被称为关系数组,它的下标既可以是整数也可以是字符或字符串或非连续整数。下标通常被称作键(key)并与对应数组元素的值相关联。数组元素和对应的值散乱地存储在awk程序表中,所以将数组元素的值打印出来的时候内容也是无须的。关系数组根据上下文环境初始化元素为数字0或空字符串。awk中数组用来做计数还要用到特殊for循环(当下标为字符串时不能用for循环来遍历数组,此时for循环把下标作为键来查找与之关联的值)。
1、整数作为数组的下标
(1)普通循环命令
说明:当输入行匹配到“john”就为数组name赋一个值,NR为记录号。在每一行匹配到John 时,name数组就赋一个值,不匹配的话就赋一个空值,因此打印出来的时候只有匹配的记录号1和10有John,其他行为空。
(2)特殊for循环
说明:特殊for循环遍历数组,只打印相应下标的元素的值,可以看到结果是无序的。
2、字符串作为数组的下标
如果是字符串作为数组的下标,则必须用引号把字符串引起来。
说明:数组count包含count[“tom”]这个元素,这个数组元素的初始值为0,每次匹配到tom时,数组元素count[“tom”]的值都加1.
说明:这条awk命令首先用记录的第1个字段作为数组的下标,数组的下标随第一个字段的变化二变化,所以数组count的第一个下标是tom,二count[“tom”] 中保存的值是1,当在第1个字段中再次出现tom时,count[“tom”]的值将被加1,于是它目前的值是2,其他mary,sean等和tom一样计数。
来看一个生产中的实例