awk入门
第1章 awk主要内容
取列 统计 计算
- 执行过程
- '找谁{干啥}'
'模式{动作}'
- 正则表达式作为条件
- 从哪里来,到哪里去条件(范围)
- BEGIN 和END
- awk数组-进行统计
1.1 awk的执行过程
[root@hsots ~]# awk -F: 'NR==2{print $NF}' passwd.txt
/sbin/nologin
1.2 '模式{动作}'
'条件/找谁{动作}'
1.3 awk眼中的 行与列
field 字段,列
record 记录,行
awk默认有一把菜刀 - 空格系列(单独的空格,连续的空格,tab键)
-F 指定分隔符
-F: === -vFS=":" OFS ===output field separator 输出每一列的的时候使用的分割符号
awk的内置变量
FS
NF ------number of field 每一行有多少列
NR ------number ofrecord 记录号 行号
$数字 取某一列
$0 取出这一行
RS ------每一行的分隔符(每一行的结束标记)换行符
OFS
1.4 正则表达式的使用
^ 某一列以...开头
$ 某一列以...结尾
1.4.1 #awk函数
gsub(r,s [, t])
gsub(/找谁/,"替换成什么" ,替换那部分的内容)
测试环境
mkdir -p /server/files/
cat >>/server/files/reg.txt<<EOF
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
EOF
awk中正则的使用
[root@hsots ~]# awk '/Li/' /server/files/reg.txt
Liu Bingbing 41117483 :250:100:175
Li Youjiu 918391635 :175:75:300
显示出第二列是包含X
[root@hsots ~]# awk '$2~/X/' /server/files/reg.txt
Zhang Xiaoyu 390320151 :155:90:201
Wang Xiaoai 3515064655 :50:95:135
显示Xiaoyu的姓氏和ID号码
[root@hsots ~]# awk '$2~/Xiaoyu/{print $1,$3}' /ses/reg.txt
Zhang 390320151
显示所有ID号码最后一位数字是1或5的人的全名
[root@hsots ~]# awk '$3~/[15]$/{print $1,$2}' iles/reg.txt
Zhang Xiaoyu
Wu Waiwai
Wang Xiaoai
Li Youjiu
Lao Nanhai
姓氏是Zhang的人,显示他的第二次捐款金额及她的名字
[root@hsots ~]# awk -F "[ :]+" '$1~/Zhang/{print $1$2,$(NF-1)}' /server/files/reg.txt
ZhangDandan 100
ZhangXiaoyu 90
显示Xiaoyu的捐款.每个值时都有以$开头.如$520$200$135
[root@hsots ~]# awk '$2~/Xiaoyu/ {gsub (/:/,"$",$NF);print $NF}' /server/files/reg.txt
$155$90$201
写一个脚本,判断当前系统上所有用户的shell是否为可登录shell(即用户的shell不是/sbin/nologin),如果是显示用户名字
~ 包含
!~不包含
[root@oldboyedu-40 files]# awk -F: '$NF!~/nologin$/{print $1,$NF}' /etc/passwd
root /bin/bash
sync /bin/sync
shutdown /sbin/shutdown
halt /sbin/halt
oldboy /bin/bash
lidao /bin/bash
alex888 /bin/bash
user01 /bin/bash
user02 /bin/bash
user03 /bin/bash
oldboy1978 /bin/bash
stu01 /bin/bash
stu02 /bin/bash
stu03 /bin/bash
kaifa /bin/bash
column -t 对齐
1.5 特殊条件 BEGIN END
1.5.1 #BEGIN{} BEGIN里面的内容会在 awk读取文件之前 运行
##测试 进行计算
[root@hsots ~]# awk 'BEGIN{print 1/3}'
0.333333
##BEGIN里面定义awk内置变量
-F: ==== -vFS=":" ===== BEGIN{FS=":"}
##
[root@oldboyedu-40 files]# awk 'BEGIN{print "姓氏","名字"}{print $1,$2}' reg.txt
姓氏 名字
Zhang Dandan
Zhang Xiaoyu
Meng Feixue
Wu Waiwai
Liu Bingbing
Wang Xiaoai
Zi Gege
Li Youjiu
1.5.2 END{} END里面的内容 会在awk读取完文件内容后执行
##先计算然后在END里面输出结果
##先计算在输出
企业案例:统计出/etc/services文件里面的空行数量
[root@hsots ~]# awk '/^$/{i++}END{print i}' /etc/services
seq100 >num.txt 计算这个文件每一行数字相加的结果
[root @hsots ~]# awk '{i=i+$1}END {print i}' num.txt
5050
i=i+1 ====i++ 统计数量 计数
i=i+$0 累计相加 累加
1.6 awk数组
分类计算
统计图片.jpg出现了多少次
统计视频.avi出现了多少次
$7~/.jpg/{a++}$7~/.avi/{b++}
假设我们的酒店
酒店<===>hotel
酒店里面有几个房间110,119,120,114,401这几个房间。
酒店的110房间<===> hotel[110]
酒店的119房间<===> hotel[119]
酒店的120房间<===> hotel[121]
酒店房间里面入住客人
hotel[110]="lidao" ;hotel[119]="tanjiaoshou";hotel[121]="taojin"
[root@oldboyedu-40 files]# awk 'BEGIN{hotel[110]="lidao" ;hotel[119]="tanjiaoshou";hotel[121]="taojin";
> print hotel[110],hotel[119],hotel[121]}'
lidao tanjiaoshou taojin
#自动显示房间的内容
awk 'BEGIN{hotel[110]="lidao" ;hotel[119]="tanjiaoshou";hotel[121]="taojin";
for(pol in hotel) #for pol in 1 2 3 4 5
print pol,hotel[pol]
}'
for(pol in hotel) pol变量对酒店进行循环/查房
print pol,hotel[pol]
#pol 得到-房间的号码
#hotel[pol] 哪个酒店的哪个房间
[root@oldboyedu-40 files]# awk 'BEGIN{hotel[110]="lidao" ;hotel[119]="tanjiaoshou";hotel[121]="taojin";
for(pol in hotel)
print pol,hotel[pol]
}'
110 lidao
121 taojin
119 tanjiaoshou
##hotel -------数组的名字
##110 119 121 -数组元素的下标(名字)
##hotel[110] -房间里面的内容
企业面试题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
方法1
[root@hsots ~]# awk -F "[/]+" '{print $2}' 1.txt|sort
mp3.etiantian.org
post.etiantian.org
post.etiantian.org
www.etiantian.org
www.etiantian.org
www.etiantian.org
[root@hsots ~]# awk -F "[/]+" '{print $2}' 1.txt|sort|uniq
mp3.etiantian.org
post.etiantian.org
www.etiantian.org
[root@hsots ~]# awk -F "[/]+" '{print $2}' 1.txt|sort|uniq -c
1 mp3.etiantian.org
2 post.etiantian.org
#sort 排序 默认是按照字母顺序
#uniq 合并 把相邻的的的一模一样的行 合并 -c显示重复的数量
方法2 awk数组
[root@hsots ~]# awk -F "[/]+" '{i[$2]++}END{for (a in i) print a ,i[a]}' 1.txt |column -t
mp3.etiantian.org 1
post.etiantian.org 2
www.etiantian.org 3
第2章 课后题目
2.1 统计secure文件中谁在破解你的密码(统计出破解你密码的ip地址出现的次数)
[root@hsots ~]# awk '$6~/Failed/{i[$(NF-3)]++}END{for (a in i)print a ,i[a]}' secure-20161219 |column -t|sort -nrk2|head
2.2 统计access.log文件中对ip地址去重并统计重复数
[root@hsots ~]# awk '{i[$1]++}END{for (a in i)print a ,i[a]}' access.log |sort -nk2|column -t
2.3 统计access.log文件中网站一共使用了多少流量
[root@hsots ~]# awk '{i=i+$10}END{print i}' access.log
2478496663
2.4 统计access.log文件中每个ip地址使用了多少流量
[root@hsots ~]# awk '{i[$1]=i[$1]+$10}END{for(a in i)print a,i[a]}' access.log|column -t