sort&&awk

作者: 逗比的一生 | 来源:发表于2019-10-15 11:35 被阅读0次

    一直会出现在各种面试题中的一条命令,提取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<行数> 显示的行数
    

    相关文章

      网友评论

          本文标题:sort&&awk

          本文链接:https://www.haomeiwen.com/subject/ehtbuctx.html