awk处理过程:
依次对每一行进行处理,然后输出。简单来说awk就是把文件逐行的读入,默认以空格为分隔符将每行切片,切开的部分再进行各种分析处理。
awk的用法:
awk 参数 ' BEGIN{} // {action1;action2} ' END{} 文件名
参数:
-F 指定分隔符
-f 调用脚本
-v 定义变量
Begin{} 初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符
// 匹配代码块,可以是字符串或正则表达式
{} 命令代码块,包含一条或多条命令,多条命令用 ; 隔开
END{} 结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息
例:统计 /etc/passwd 文件中包含root行的总数
awk 'BEGIN{X=0}/root/{X+=1}END{print "I find",X,"root lines"}' /etc/passwd
awk '{print}' /etc/passwd == awk '{print $0}' /etc/passwd
awk '{print " "}' /etc/passwd 不输出passwd的内容,而是输出相同个数的空行,进一步解释了awk是一行一行处理文本
[root@node1 ~]# cat a.txt
http://www.etiantian.org/index.html
http://www.etiantian.org/1.html
http://post.etiantian.org/index.html
http://mp3.etiantian.org/index.html
http://www.etiantian.org/3.html
http://post.etiantian.org/2.html
[root@node1 ~]# cut -d / -f3 a.txt
www.etiantian.org
www.etiantian.org
post.etiantian.org
mp3.etiantian.org
www.etiantian.org
post.etiantian.org
[root@node1 ~]# cut -d / -f3 a.txt|sort
mp3.etiantian.org
post.etiantian.org
post.etiantian.org
www.etiantian.org
www.etiantian.org
www.etiantian.org
[root@node1 ~]# cut -d / -f3 a.txt|sort|uniq
mp3.etiantian.org
post.etiantian.org
www.etiantian.org
[root@node1 ~]# cut -d / -f3 a.txt|sort|uniq -c
1 mp3.etiantian.org
2 post.etiantian.org
3 www.etiantian.org
[root@node1 ~]#
[root@node1 ~]# cat a.txt
http://www.etiantian.org/index.html
http://www.etiantian.org/1.html
http://post.etiantian.org/index.html
http://mp3.etiantian.org/index.html
http://www.etiantian.org/3.html
http://post.etiantian.org/2.html
[root@node1 ~]# awk -F "/" '{print $3}' a.txt|sort
mp3.etiantian.org
post.etiantian.org
post.etiantian.org
www.etiantian.org
www.etiantian.org
www.etiantian.org
[root@node1 ~]# awk -F "/" '{print $3}' a.txt|sort|uniq -c
1 mp3.etiantian.org
2 post.etiantian.org
3 www.etiantian.org
[root@node1 ~]# awk -F "/" '{print $3}' a.txt|sort|uniq -c|sort -nr
3 www.etiantian.org
2 post.etiantian.org
1 mp3.etiantian.org
[root@node1 ~]#
awk 在不指名-F域分隔符的情况下,默认的域分隔符是空格。
# 输出包含 "re" 的行
$ awk '/re/ ' log.txt
# 输出第二列包含 "th",并打印第二列与第四列
$ awk '$2 ~ /th/ {print $2,$4}' log.txt
# -v # 设置变量
[root@centos7 ~]# cat log.txt
2 this is a test
3 Are you like awk
10 There are orange,apple,mongo
[root@centos7 ~]#
[root@centos7 ~]# awk '{print $1}' log.txt
2
3
10
[root@centos7 ~]# awk -v a=1 '{print $1+a}' log.txt
3
4
11
[root@centos7 ~]#
[root@centos7 ~]# awk -F '/' '{print $3}' oldboy.log|sort|uniq -c|sort -r # -r 倒排序
3 mp3.etiantian.org
2 post.etiantian.org
1 www.etiantian.org
[root@centos7 ~]# awk 'BEGIN{array[1]="oldboy";array[2]="oldgirl";for(key in array) print key,array[key]}'
1 oldboy
2 oldgirl
[root@centos7 ~]#
注意: awk 后面不加文件,开头必须要添加BEGIN
[root@centos7 ~]# for i in 1 2 3 ;do echo $i ;done
1
2
3
[root@centos7 ~]#
提供BEGIN和END的作用是给程序赋予初始状态和程序结束之后执行一些扫尾的工作。
任何在BEGIN之后列出的操作(在{}内)将在awk开始扫描输入之前执行,而END之后列出的操作将在扫描完全部的输入之后执行,
因此,通常使用BEGIN来显示变量和预置(初始化)变量,使用END来输出最终结果。
注意: awk 有END的话必须要有一个文件在最后
[root@centos7 ~]# awk 'BEGIN{array[1]="oldboy";array[2]="oldgirl"} END{for(key in array) print key,array[key]}' /etc/hosts
1 oldboy
2 oldgirl
[root@centos7 ~]#
[root@centos7 ~]# cat c.txt
http://www.etiantian.org/index.html
http://www.etiantian.org/1.html
http://post.etiantian.org/index.html
http://mp3.etiantian.org/index.html
http://www.etiantian.org/3.html
http://post.etiantian.org/2.html
[root@centos7 ~]#
[root@centos7 ~]#
[root@centos7 ~]# cat c.txt |awk -F '/' '{print $3}'
www.etiantian.org
www.etiantian.org
post.etiantian.org
mp3.etiantian.org
www.etiantian.org
post.etiantian.org
[root@centos7 ~]#
[root@centos7 ~]#
[root@centos7 ~]# cat c.txt |awk -F '/' '{print $3}'|awk '{s[$1]=s[$1]+1} END{ for(k in s) print k,s[k]}'
mp3.etiantian.org 1
www.etiantian.org 3
post.etiantian.org 2
[root@centos7 ~]#
[root@centos7 ~]# cat c.txt
http://www.etiantian.org/index.html
http://www.etiantian.org/1.html
http://post.etiantian.org/index.html
http://mp3.etiantian.org/index.html
http://www.etiantian.org/3.html
http://post.etiantian.org/2.html
[root@centos7 ~]#
[root@centos7 ~]# awk -F '/' '{s[$3]=s[$3]+1} END{ for(k in s) print k,s[k] }' c.txt
mp3.etiantian.org 1
www.etiantian.org 3
post.etiantian.org 2
[root@centos7 ~]#
[root@centos7 ~]#
[root@centos7 ~]# awk 'BEGIN{ S["mp3.etiantian.org"]=1; S["www.etiantian.org"]=3; S["post.etiantian.org"]=2; for(key in S) print S[key],key}'
1 mp3.etiantian.org
3 www.etiantian.org
2 post.etiantian.org
[root@centos7 ~]#
4.假如现在有个文本,格式如下:
a 1
b 3
c 2
d 7
b 5
a 3
g 2
f 6
d 9
即左边是随机字母,右边是随机数字,要求写个脚本使其输出格式为:
a 4
b 8
c 2
d 16
f 6
g 2
参考解答:
[root@oldboytraining ~]# cat oldboy.log
a 1
b 3
c 2
d 7
b 5
a 3
g 2
f 6
d 9
[root@oldboytraining ~]# awk '{oldboy_size[$1]+=$2} END {for(a in oldboy_size) print a, oldboy_size[a]}' oldboy.log
a 4
b 8
c 2
d 16
f 6
g 2
1)IDC带宽被占满的原因很多,常见的有:
a.真实遭受DDOS攻击(遇到过几次,造成影响的不多见,其中还有黑客勒索的案例)。
b.内部服务器中毒,大量外发流量(这个问题老男孩接警5次以上)
c.网站元素(如图片)被盗连,在门户页面被推广导致大量流量产生(接警3次以上)
d.合作公司来抓数据,如:对合作单位提供了API数据接口(有合作的公司的朋友了解这个)
e.购买了CDN业务,CDN猛抓源站(这个次数也不少)。
f.其他原因还有一些,不普遍就不提了。
2)CDN带宽异常,源站没异常。
这类问题基本都是缓存在CDN的数据被频繁访问引起的。解决方法见结尾案例。
3) CDN带宽异常,源站也异常。
可能原因如公司做推广,大量数据访问,热点数据cache里不全。或CDN问题导致数据回源(有关CDN回源率问题及提升回源率经验,以后再和大家分享)。
影响就是带宽高,后端静态服务器及图片及存储压力大(解决办法见老男孩的7层门户网站架构案例文章http://oldboy.blog.51cto.com/2561410/736710)
统计apache日志单ip访问请求数排名:
http://oldboy.blog.51cto.com/blog/2561410/1184177
统计生产服务器某个业务web上连接状态数量:
http://oldboy.blog.51cto.com/2561410/1184139
浅谈千万级PV/IP规模高性能高并发网站架构:
http://oldboy.blog.51cto.com/2561410/736710
将相同的字母后面的数字加在一起,按字母的顺序输出:
http://user.qzone.qq.com/49000448/blog/1423046131
IDC 机房带宽突然从平时 100M 增加到 400M,请你分析问题所在并解决:
https://blog.51cto.com/lidao/1942883