作者Georgekai

归档:学习笔记

2018/1/12




本章正题:awk执行过程、模式、数组

1.1 awk

1. awk:全称就是gawk

2. 查看awk版本: awk --version

3. awk '找谁{干啥}'

 找谁:模式pattern  干啥:动作action

1.1.1 awk执行过程

图片6.png

 

1.2 awk的模式:正则表达式作为模式、比较表达式作为模式NR>10、范围模式、

特殊模式BEGINEND

 

1.2.1  正则表达式作为模式

^ :在awk中表示某一列中以什么什么开头的行,如:$3~/^root/就是查找第三列以 root   头的行

~ :表示匹配后面的条件

!~:表示不匹配的意思

1:找出第三列中包含连续的数字0的行

[root@georgekai files]# awk  '$3~/0+/{print $0}' reg.txt

Zhang Xiaoyu    390320151  :155:90:201

Meng  Feixue    80042789   :250:60:50

Wu    Waiwai    70271111   :250:80:75

Wang  Xiaoai    3515064655 :50:95:135

Zi    Gege      1986787350 :250:168:200

注:表示在第三列中匹配出条件为连续0的行

2:找出第三列中连续出现俩次及以上0的行

[root@georgekai files]# awk --re-interval '$3~/0{2,}/{print $0}' reg.txt

Meng  Feixue    80042789   :250:60:50

3:显示小于的姓氏和ID号码

[root@georgekai files]# awk '$2~/Xiaoyu/{print $1,$3}' reg.txt

Zhang 390320151

注:1.awk '/Xiaoyu/' reg.txt == 相当于'$0~/Xiaoyu/'

2.$0表示这一行的所有

3:姓氏Zhang的人,显示他的第二次捐款金额及他的名字

方法一:

[root@georgekai files]# awk -F "[: ]+" '$1~/Zhang/{print $2,$5}' reg.txt

Dandan 100

Xiaoyu 90

方法二:

[root@georgekai files]# awk -F "[: ]+" '$1~/Zhang/{print $2,$(NF-1)}' reg.txt

Dandan 100

Xiaoyu 90

注:NF-1相当于倒数第二行

4:显示所有以41开头的ID号码的人的全名和ID号码

[root@georgekai files]# awk -F "[ :]+" '$3~/^41/{print $1,$2,$(NF-3)}' reg.txtZhang Dandan 41117397

Liu Bingbing 41117483

5:显示所有ID号码最后以为数字是1或5的人的全名

[root@georgekai files]# awk -F "[ :]+" '$3~/[15]$/{print $1,$2}' reg.txt

Zhang Xiaoyu

Wu Waiwai

Wang Xiaoai

Li Youjiu

Lao Nanhai

注:也可以用(1|5)$,1$|5$

6;显示Xiaoyu的捐款,数额都以$开头,如$520$200$135

方法一:利用tr做替换

[root@georgekai files]# awk -F "[ ]+" '$2~/Xiaoyu/{print $NF}' reg.txt|tr ':' '$'

$155$90$201

方法二:awk中的替换)gsub

[root@georgekai files]# awk '$2~/Xiaoyu/{gsub(/:/,"$",$NF);print $0}' reg.txt

 注:1.语法:gsub函数:gsub(/你要什么/,“替换成什么”,去第几列)

awk '{gsub(/:/,"$",$NF);print $0}' reg.txt

 2.也可以省略后面的逗号和$NF

 

1.2.2 awk的特殊模式BEGIN{}END{}

1. BEGIN{} 里面的内容会在awk读取文件之前执行

2. BEGIN{}作用:测试,计算,修改awk内置变量

3. awk里面的内置变量

1)字段分隔符:-F  ===  相当于修改FSfield separator

        -F ":" == BEGIN{FS=":"} == -vFS":"

2NR:行号   $0   

3NF :number of  field 每一行有多少列

4. END{} 里面的内容会在awk读取完文件内容之后运行

注:一般用来先计算,再显示END输出的最终结果

END的效果:

 [root@georgekai files]# awk '{print $0}END{print "Bey"}' reg.txt

Zhang Dandan    41117397   :250:100:175

Lao   Nanhai    918391635  :250:100:175

Bey

 

 

1:统计/etc/services文件中空行数量

方法一:grep -c 统计:

[root@georgekai files]# grep -c '^$' /etc/services

16

方法二:awk i=i+1统计

[root@georgekai files]# awk '/^$/{i=i+1;print i}' /etc/services

 注:最开始的时候,i=0 ,一个{}中,多条命令用分号分割

公式:1.i=i+1 或  i++ (用于技术)

  2.sum=sum+$n   sum总数

  3.i=i+$n 或i+=$n  (计算总和,累加)$n表示第几列

方法三:先计算,END显示最终结果

[root@georgekai files]# awk '/^$/{i++}END{print i}' /etc/services

16

2:统计出/etc/passwd 中有多少个虚拟用户

[root@georgekai files]# awk -F "[:]+" '$NF~/nologin/{i++}END{print i}' /etc/passwd

24

3:seq 10 统计1到10数字的相加

[root@georgekai files]# seq 10 |awk '{i=i+$0}END{print i}'

55

[root@georgekai files]# seq 10|awk '{sum=sum+$1}END{print sum}'

55

   

1.3 awk数组

awk数组的组成

数组的名字+[元素]=元素内容

 

1:显示出www的执行过程

图片7.png 

图片8.png


 

2:显示出元素内容中www、post、mp3各出现了多少次:

[root@georgekai files]# awk -F "[/.]+" '{h[$2]++}END{print h["www"],h["post"],h["mp3"]}' hotel.log

3 2 1

注:h["www"]的结果就是3,h["pst"]就是2,h["mps"]就是1

[root@oldboyedu43-lnb files]# awk -F "[/.]+" '{h[$2]++}END{for( pol in h  ) print pol,h[pol]}' url.txt

www 3

mp3 1

post 2

注:for循环中,pol就代表$2中的某一行,h就是数组的名称,pol in h 就是h[pol],相当于h[$2中  ],print pol就是输出$2中一行的内容,print h[pol]就是元素的内容,相当于h[pol]++的结果(因  为有END,所以只显示最后统计的数)

3:统计谁在破解你的密码

[root@oldboyedu43-lnb files]# awk '/Failed password/{h[$(NF-3)]++}END{for( pol in h  ) print pol,h[pol]}' secure-20161219 |sort -rnk2 |column -t

218.65.30.25     68652

218.65.30.53     34326

218.87.109.154   21201

112.85.42.103    18065

注:column -t 显示顺序,sort进行排序,-r逆序,-n把内容当做数字进行排序,-k2给第二列排序

4:哪个用户破解的次数最多

[root@georgekai files]# awk '/Failed pas/{h[$(NF-5)]++}END{for ( wk in h ) print wk,h[wk]}' secure-20161219|sort -rnk2|column -t

注:只需元素换成要用户那一列即可