楼上两个真经典, 受教受教. 我菜鸟冒昧解释解释两位的命令
cat log.txt| gawk -F'#| ' '{print $5}'|sort|uniq -c|gawk '{print $2,$1}'
-F'#| ' 利用#或者空格分隔, 第一次碰到学习了
sort 排序
uniq -c 合并重复, 统计个数
awk -F"[# ]" '{a[$5]=a[$5]"z"}END{for( i in a )print i"\n", length(a[i])}' temp.log
太nb了, 佩服佩服awk用的如此之娴熟
-F"[# ]" 同样用#或者空格分隔, 学习学习
a[$5]=a[$5] awk关联数组, 太经典了, a[$5]用字符串做数组a的下标, 而字符串本身就是IP地址, =a[$5]"z"太nb了, 看了半天才明白, 数字内部保存的只是z, 如果遇到重复的下标只是保存了zz, NB呀高手. 后面结束的时候循环只是打印出来了下标i(IP地址), 而数组的内容实际上是a[i](也就是1个或者多个z), 然后用内置函数length取出来数字内有多少个z就是重复了几次. 高!
厚颜无耻的补充一下排序加上sort就行了
awk -F"[# ]" '{a[$5]=a[$5]"z"}END{for( i in a )print i" ", length(a[i]) | "sort"}' datafile
to 楼上
谦虚谦虚了
看了优化命令
awk -F"#| " '{a[$5]++}END{for(i in a)print i"\n"a[i]}' temp.log 1>aaa.txt
不错, 我又没有想到!!! 直接自增1 不用length统计了直接打印. 太棒了
#!/bin/bash
awk -F"[# ]" '{a[$5]=a[$5]"z"}END{for( i in a )print i"\n", length(a[i])}' temp.log 1>aaa.txt
楼上的以为我的答案很高明,让我汗颜呀,我来个针对特例优化后的吧,原理与上面一样
awk -F"#| " '{a[$5]++}END{for(i in a)print i"\n"a[i]}' temp.log 1>aaa.txt
假设这个文件名:log.txt
命令如下:
cat log.txt| gawk -F'#| ' '{print $5}'|sort|uniq -c|gawk '{print $2,$1}'