一直会出现在各种面试题中的一条命令,提取nginx日志中出现次数最多的前10个IP地址。
解读以下这条命令
$ cat access.20120104.log | awk '{a[$1]++} END {for(b in a) print b"\t"a[b]}' | sort -k2 -r | head -n 10
163.177.71.12 972
101.226.68.137 972
183.195.232.138 971
50.116.27.194 97
14.17.29.86 96
61.135.216.104 94
61.135.216.105 91
61.186.190.41 9
59.39.192.108 9
220.181.51.212 9
{a[$1]}
对于awk 'a[$1]',需要了解3个知识点
1、awk数组知识
2、awk的基本命令格式 awk 'pattern{action}'
省略action时,默认action是{print},如awk '1'就是awk '1{print}'
3、var的形式:先读取var变量值,再对var值+1
最后实现的效果就是去除$1重复的行,并计算次数
等同于这个 awk '{a[$1]++} {print $1"->"a[$1]} ' access.20120104.log
{for(b in a) print b"\t"a}
取出数组中的下标 b,也就是IP地址和a它的个数
数组的使用
1、建立数组
array[index] = value :数组名array,下标index以及相应的值value。
2、读取数组值
{ for (item in array) print array[item]} # 输出的顺序是随机的
{for(i=1;i<=len;i++) print array} # Len 是数组的长度
3、多维数组,array[index1,index2,……]:SUBSEP是数组下标分割符,默认为“\034”。可以事先设定SUBSEP,也可以直接在SUBSEP的位置输入你要用的分隔符,如:
awk 'BEGIN{SUBSEP=":";array["a","b"]=1;for(i in array) print i}'
a:b
awk 'BEGIN{array["a"":""b"]=1;for(i in array) print i}'
a:b
sort排序
-k来指定列数
-t选项,后面可以设定间隔符
-n选项,要以数值来排序
-r选项 sort默认的排序方式是升序,如果想改成降序,就加个-r
-u选项,就是在输出行中去除重复行
head
head [参数]... [文件]...
命令参数:
-q 隐藏文件名
-v 显示文件名
-c<字节> 显示字节数
-n<行数> 显示的行数
网友评论