第1章 awk数组
1.取出/etc/passwd中uid在1到500之间的用户名和uid号码
2.显示系统最近一分钟 五分钟 十五分钟的负载
3.显示你系统中所有的非虚拟用户的用户名和使用的shell并统计数量
4.统计Secure(给大家发送的)文件每个ip地址破解你密码次数显示前十名
5.统计Secure中每个用户破解的次数
6.统计access.log中所有流量总和(第10列)
1.1 1.取出/etc/passwd中uid在1到500之间的用户名和uid号码
条件:
动作
[root@zs ~]# awk -F: '$3>=1&&$3<500{print $1,$3}' /etc/passwd
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
mail 8
uucp 10
operator 11
games 12
gopher 13
ftp 14
nobody 99
dbus 81
vcsa 69
abrt 173
1.2 2.显示系统最近一分钟 五分钟 十五分钟的负载
[root@zs ~]# w|awk -F "[: ]+" '/load/{print $(NF-2),$(NF-1),$NF}'
0.02, 0.05, 0.00
:
指定分隔符为(:和空格)
:
条件为包含load的行
:
输出倒数第三列,倒数第二列,最后一列
1.3 显示你系统中所有的非虚拟用户的用户名和使用的shell并统计数量
[root@zs ~]# awk -F: '/bash$/{i++;print $1,$NF}END{print i}' /etc/passwd
std22 /bin/bash
std23 /bin/bash
std24 /bin/bash
std25 /bin/bash
std26 /bin/bash
.
.
.
51
[root@oldboyedu50-lnb ~]# seq 10
1
2
3
4
5
6
7
8
9
10
i=i+1 == i++ 统计次数 wc -l
i=i+$1 == i+=$1 求和 累加 1+2+3.。。。+100
1.4 统计access.log中所有流量总和(第10列) GB (默认单位是字节)
[root@zs files]# awk '{i=i+$10}END{print i/1024^3*100"G"}' access.log
1.58137G
第2章 awk中循环与判断
2.1 #shell编程
2.1.1 判断
if [ ];then
xxxx
fi
2.2 awk中的
if(NR==1)
print $0
if(NR==1) print $0
实例2-1 :显示第1行
[root@zs files]# awk 'NR==1' reg.txt
Zhang Dandan 41117397 :250:100:175
[root@zs files]# awk '{if(NR==1)print}' reg.txt
Zhang Dandan 41117397 :250:100:175
2.3 统计{}中包含oldboy的行行数
2.3.1 创建环境
cat range.txt
oldboy
oldboy
oldboy
{
lidao
oldboy
alex
oldboy oldboy
}
oldboy
oldboy
oldboy
{
lidao
oldboy
alex
oldboy oldboy
}
oldboy
{
lidao
oldboy
alex
oldboy oldboy
}
统计{}中包含oldboy的行数
[root@oldboyedu50-lnb /server/files]# awk '/{/,/}/' range.txt
{
lidao
oldboy
alex
oldboy oldboy
}
{
lidao
oldboy
alex
oldboy oldboy
}
{
lidao
oldboy
alex
oldboy oldboy
}
统计行数:
多个条件的时候 无法使用&& || 实现的时候
if(条件)
命令 ;
[root@zs files]# awk '/{/,/}/{if(/oldboy/)i++}END{print i}' range.txt
6
2.4 awk 判断小结:
2.4.1 尽量模式作为条件
'NR==1'
'$5>100'
2.5 #统计{}中包含oldboy的行行数
cat range.txt
oldboy
oldboy
oldboy
{
lidao
oldboy
alex
oldboy oldboy
}
oldboy
oldboy
oldboy
{
lidao
oldboy
alex
oldboy oldboy
}
oldboy
{
lidao
oldboy
alex
oldboy oldboy
}
2.5.1 awk循环
实例2-2 for(i=1;i<=100;i++)
命令
[root@zs files]# awk 'BEGIN{for(i=1;i<=100;i++)sum=sum+i}'
# 显示最终结果
[root@zs files]# awk 'BEGIN{for(i=1;i<=100;i++)sum=sum+i;print sum}'
5050
for(i=1;i<=100;i++)sum=sum+i ;
print sum
for((i=1;i<=100;i++))
do
echo $i
done
2.6 awk 循环小结:
2.6.1 熟悉格式
2.6.2 计算1+....100
第3章 #awk数组
3.1 统计
实例3-1 处理以下文件内容,将域名取出并根据域名进行计数排序处理:(百度和sohu面试题)
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
h[110]
数组名称[元素]
数组名称[下标]
酒店[房间]
引导:
#awk 'BEGIN{ h[110]="laowang";h[120]="tao"; print h[110],h[120],h[12306] }'
laowang tao
[root@oldboyedu50-lnb /server/files]# awk -F"[/.]+" '/www/{i++}/post/{j++}/mp3/{k++}END{print i,j,k}' url.txt
3 2 1
实例3-2 #awk数组 统计 www post mp3出现的次数
查看指定分隔符之后第二列的内容
[root@zs files]# awk -F"[./]+" '{print $2}' yuming.txt
www
www
post
mp3
www
post
统计www出现的次数
[root@zs files]# awk -F"[./]+" '{h[$2]++;print h["www"]}' yuming.txt
1
2
2
2
3
3
实例3-3 显示www post mp3出现次数
[root@zs files]# awk -F"[./]+" '{h[$2]++};END{print h["www"],h["post"],h["mp3"]}' yuming.txt
3 2 1
实例3-4 自动显示数组里面的内容
[root@zs files]# awk -F"[./]+" '{h[$2]++}END{for(i in h)print i}' yuming.txt
www
mp3
post
[root@zs files]# awk -F"[./]+" '{h[$2]++}END{for(i in h)print i h[i]}' yuming.txt
www3
mp31
post2
#进行分类统计
{h[$2]++}
#统计之后显示
END{for(i in h) print i,h[i] }
实例3-5 统计Secure(给大家发送的)文件每个ip地址破解你密码次数显示前十名
关键字:Failed
sort -rnk2
#-r 逆序
#-n 按照数字 顺序排序
#-k 根据某一列的内容排序
[root@zs files]# awk '/Failed/{h[$(NF-3)]++}END{for(i in h)print i,h[i]}' secure-20161219 |sort -rnk2|head
218.65.30.25 68652
218.65.30.53 34326
218.87.109.154 21201
112.85.42.103 18065
112.85.42.99 17164
218.87.109.151 17163
218.87.109.150 17163
218.65.30.61 17163
218.65.30.126 17163
218.65.30.124 17163
awk -F"[/.]+" '{h[$2]++} END{for(i in h) print i,h[i] }' url.txt
awk '/Failed/{h[$(NF-3)]++}END{for(i in h) print i,h[i] }' secure-20161219
实例3-6 统计Secure中每个用户破解的次数 显示前10
[root@zs files]# awk '/Failed/{h[$(NF-5)]++}END{for(i in h)print i,h[i]}' secure-20161219 |sort -rnk2|head
root 364610
admin 733
user 246
oracle 119
support 104
guest 79
test 70
ubnt 47
pi 41
webadmin 36
第4章 总结:
4.1 awk数组
4.2 awk使用判断与循环
4.2.1 模式
'模式{
动作}'4.2.2 if for
4.2.3 计算公式
i=i+1 == i++ 统计次数 wc -l
i=i+$1 == i+=$1 求和 累加 1+2+3.。。。+100
h[$1]++
h[$1]+=$1