awk统计排序,awk 的分隔符
access_log 是一个日志文件,现在对里面的IP地址进行统计,并且按数量进行降序排序。
日志样式如:
211.143.50.68 - - [13/Oct/2014:17:05:40 +0800] "POST /mobile/user/login.
216.58.115.41 - - [13/Oct/2014:17:05:40 +0800] "POST /mobile/user/
119.251.70.91 - - [13/Oct/2014:17:05:40 +0800] "POST /mobile/user/
223.98.200.171 - - [13/Oct/2014:17:05:40 +0800] "POST /mobile/
223.98.200.171 - - [13/Oct/2014:17:05:40 +0800] "POST /GameCallBack
命令:awk '{a[$1]++} END{for(i in a){print i,a[i] | "sort -r -n -k 2"}}' access_log
统计结果为:ip 数量,如:
42.62.86.204 222096
106.3.40.36 104001
120.42.197.250 98855
123.84.153.73 72438
42.62.29.140 55620
123.84.163.107 54370
命令说明:
a[$1]++ :默认是以空格为分隔符的,ip地址是第一个字段,所以a[$1]++就是统计每个ip出现的数量,
END:表示为脚本运行完之后要执行的语句,即之后的打印排序
sort -r -n -k:是排序 -r:是倒序; -n:是以数字的形式排序,默认是以字符的形式排序;-k是以那个字段进行排序,因为print i a[i],所以统计的数量是第二个字段,所以此处是2.
awk 的分隔符
awk 分隔符的使用:
1.awk -F分隔符
2.是用分隔符变量 awk -v FS='分隔符'
3.输出分隔符变量 awk -v OFS='分隔符'
4.输出变量用','分割后将割开显示 awk '{print $1,$2}'
5.输出变量用' '分割后将连接显示 awk '{print $1 $2}'
-
LM-SHC-16507744:Desktop yanwxu$ cat testd
-
123#ruby#3#abc
-
456#rechel#25#def
-
789#wang#30#ghi
-
LM-SHC-16507744:Desktop yanwxu$ awk -F# '{print $1,$2}' testd
-
123 ruby
-
456 rechel
-
789 wang
-
LM-SHC-16507744:Desktop yanwxu$ awk -v FS='#' '{print $1,$2}' testd
-
123 ruby
-
456 rechel
-
789 wang
-
LM-SHC-16507744:Desktop yanwxu$ awk -v FS='#' OFS='+++++' '{print $1,$2}' testd
-
awk: syntax error at source line 1
-
context is
-
>>> OFS=++++ <<<
-
awk: bailing out at source line 1
-
LM-SHC-16507744:Desktop yanwxu$ awk -v FS='#' -v OFS='+++++' '{print $1,$2}' testd
-
123+++++ruby
-
456+++++rechel
-
789+++++wang
-
LM-SHC-16507744:Desktop yanwxu$ awk -F# '{print $1,$2}' testd
-
123 ruby
-
456 rechel
-
789 wang
-
LM-SHC-16507744:Desktop yanwxu$ awk -F# '{print $1 $2}' testd
-
123ruby
-
456rechel
-
789wang