第1章 awk数组

 

1.取出/etc/passwduid1500之间的用户名和uid号码

2.显示系统最近一分钟 五分钟 十五分钟的负载

3.显示你系统中所有的非虚拟用户的用户名和使用的shell并统计数量

4.统计Secure(给大家发送的)文件每个ip地址破解你密码次数显示前十名

5.统计Secure中每个用户破解的次数

6.统计access.log中所有流量总和(第10列)

 

1.1 1.取出/etc/passwduid1500之间的用户名和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

                                              image.png

 

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

image.png

 [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

image.png

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

image.png

 

实例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

image.png

 

实例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