awk执行过程模式数组
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了awk执行过程模式数组相关的知识,希望对你有一定的参考价值。
作者:Georgekai 归档:学习笔记 2018/1/12 |
本章正题:awk执行过程、模式、数组
1.1 awk
1. awk:全称就是gawk
2. 查看awk版本: awk --version
3. awk '找谁{干啥}'
找谁:模式pattern 干啥:动作action
1.1.1 awk执行过程
1.2 awk的模式:正则表达式作为模式、比较表达式作为模式NR>10、范围模式、
特殊模式BEGIN和END
1.2.1 正则表达式作为模式
^ :在awk中表示某一列中以什么什么开头的行,如:$3~/^root/就是查找第三列以 root开 头的行
~ :表示匹配后面的条件
!~:表示不匹配的意思
例1:找出第三列中包含连续的数字0的行
[[email protected] 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的行
[[email protected] files]# awk --re-interval '$3~/0{2,}/{print $0}' reg.txt
Meng Feixue 80042789 :250:60:50
例3:显示小于的姓氏和ID号码
[[email protected] files]# awk '$2~/Xiaoyu/{print $1,$3}' reg.txt
Zhang 390320151
注:1.awk '/Xiaoyu/' reg.txt == 相当于'$0~/Xiaoyu/'
2.$0表示这一行的所有
例3:姓氏Zhang的人,显示他的第二次捐款金额及他的名字
方法一:
[[email protected] files]# awk -F "[: ]+" '$1~/Zhang/{print $2,$5}' reg.txt
Dandan 100
Xiaoyu 90
方法二:
[[email protected] files]# awk -F "[: ]+" '$1~/Zhang/{print $2,$(NF-1)}' reg.txt
Dandan 100
Xiaoyu 90
注:NF-1相当于倒数第二行
例4:显示所有以41开头的ID号码的人的全名和ID号码
[[email protected] files]# awk -F "[ :]+" '$3~/^41/{print $1,$2,$(NF-3)}' reg.txtZhang Dandan 41117397
Liu Bingbing 41117483
例5:显示所有ID号码最后以为数字是1或5的人的全名
[[email protected] 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做替换
[[email protected] files]# awk -F "[ ]+" '$2~/Xiaoyu/{print $NF}' reg.txt|tr ':' '$'
$155$90$201
方法二:(awk中的替换)gsub
[[email protected] 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 === 相当于修改FS(field separator)
-F ":" == BEGIN{FS=":"} == -vFS":"
2)NR:行号 $0
3)NF :number of field 每一行有多少列
4. END{} 里面的内容会在awk读取完文件内容之后运行
注:一般用来先计算,再显示END输出的最终结果
END的效果:
[[email protected] 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 统计:
[[email protected] files]# grep -c '^$' /etc/services
16
方法二:awk i=i+1统计
[[email protected] 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显示最终结果
[[email protected] files]# awk '/^$/{i++}END{print i}' /etc/services
16
例2:统计出/etc/passwd 中有多少个虚拟用户
[[email protected] files]# awk -F "[:]+" '$NF~/nologin/{i++}END{print i}' /etc/passwd
24
例3:seq 10 统计1到10数字的相加
[[email protected] files]# seq 10 |awk '{i=i+$0}END{print i}'
55
[[email protected] files]# seq 10|awk '{sum=sum+$1}END{print sum}'
55
1.3 awk数组
awk数组的组成:
数组的名字+[元素]=元素内容
例1:显示出www的执行过程
例2:显示出元素内容中www、post、mp3各出现了多少次:
[[email protected] 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
[[email protected] 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:统计谁在破解你的密码
[[email protected] 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:哪个用户破解的次数最多
[[email protected] files]# awk '/Failed pas/{h[$(NF-5)]++}END{for ( wk in h ) print wk,h[wk]}' secure-20161219|sort -rnk2|column -t
注:只需元素换成要用户那一列即可
以上是关于awk执行过程模式数组的主要内容,如果未能解决你的问题,请参考以下文章