01课程介绍
1掌握awk命令基础用法
2 掌握awk命令扩展功能:统计 运算功能
高级部分awk数组部分 shell数组
02课程回顾
sed 命令作用了解
语法结构: sed[参数] ‘条件 sed指令’ 文件信息
sed命令实际应用:
查询数据信息:sed -n ‘/查询信息/p’ 文件信息
添加数据信息: sed -i.bak ‘条件信息 在哪个位置i/a 添加的内容信息’ 文件信息
删除数据信息: sed -ir.bak ‘/条件01|条件02/d’ 文件信息
替换/修改数据信息:sed -i.bak ‘s#要替换的信息#替换成的信息#g’ 文件信息
:sed -ri.bak ‘s#要替换的信息(保留信息)#替换成的信息\1#g’ 文件信息 (后项引用前项)
:sed -i.bak ‘s#正则匹配信息#&#g’ 文件信息
:sed -i.bak ‘3c oldboy’ 文件信息 整行替换
sed命令测验练习
利用sed命令取出IP地址
利用sed命令批量创建用户
利用sed命令取出文件权限
利用sed命令批量修改文件扩展名
利用sed命令编写脚本.修改服务器IP地址信息脚本 sh change_ip.sh
03三剑客awk概述
awk 说明图:
gawk - pattern scanning and processing language 可以模式扫描与处理语言
语法结构: awk [参数] ‘模式{动作}’ 文件信息
执行原理:
功能说明:擅长处理日志文件.排除 查询 统计 替换
04三剑客命令: awk作用说明
处理文件信息:文本文件 日志文件 配置文件
处理文件方式: 排除信息 查询信息 统计信息 替换信息
05三剑客命令awk操作:
创建环境:
cat >> 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
1显示Xiaoyu的姓氏和ID 号码
awk’{print 3}’ 文件信息
1).找出需要编写模式信息
获取 Xiaoyu信息
[root@oldboy63 ~]# awk '/Xiaoyu/' reg.txt
Zhang Xiaoyu 390320151 :155:90:201
2 )根据条件做处理
显示满足条件的第三列和第一列
~--匹配的意思
[root@oldboy63 ~]# awk '$2~/Xiaoyu/' reg.txt
Zhang Xiaoyu 390320151 :155:90:201
[root@oldboy63 ~]# awk '$2~/Xiaoyu/{print $1 $3}' reg.txt
Zhang390320151
[root@oldboy63 ~]# awk '$2~/Xiaoyu/{print $1, $3}' reg.txt
Zhang 390320151
2,姓氏是张的人,显示他的第二次捐款金额及他的名字
第一:找出需要编写模式信息
[root@oldboy63 ~]# awk '$1~/Zhang/' reg.txt
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
第二:根据条件做处理
默认分割方式,使用空格分割列
[root@oldboy63 ~]# awk '$1~/Zhang/{print $1, $2, $4}' reg.txt
Zhang Dandan :250:100:175
Zhang Xiaoyu :155:90:201
指定分割符 -F “:”
[root@oldboy63 ~]# awk -F ":" '$1~/Zhang/{print $1, $2, $4}' reg.txt
Zhang Dandan 41117397 250 175
Zhang Xiaoyu 390320151 155 201
将多个连续分割合并为一个整体: -F "[: ]+"
[root@oldboy63 ~]# awk -F "[: ]+" '$1~/Zhang/{print $1, $2, $4}' reg.txt
Zhang Dandan 250
Zhang Xiaoyu 155
[root@oldboy63 ~]# awk -F "[: ]+" '$1~/Zhang/{print $1, $2, $5}' reg.txt
Zhang Dandan 100
Zhang Xiaoyu 90
3,显示所有以41 开头的ID号码的人的全名和ID号码
[root@oldboy63 ~]# awk '$3~/^41/{print $1, $2, $3}' reg.txt
Zhang Dandan 41117397
Liu Bingbing 41117483
4.显示所有ID号码最后一位数字是以1 或5 的人的全名
[root@oldboy63 ~]# awk '$3~/1$|5$/{print $1, $2, $3}' reg.txt |column -t
Zhang Xiaoyu 390320151
Wu Waiwai 70271111
Wang Xiaoai 3515064655
Li Youjiu 918391635
Lao Nanhai 918391635
[root@oldboy63 ~]# awk '$3~/(1|5)$/{print $1, $2, $3}' reg.txt |column -t
[root@oldboy63 ~]# awk '$3~/[15]$/{print $1, $2, $3}' reg.txt |column -t
5.获取文件中有井号和空行的内容,将空行和井号信息的信息排除
找出需要编写模式信息
[root@oldboy63 ~]#awk '$0~/^#|^$/' reg.txt
#Zhang Xiaoyu 390320151 :155:90:201
#Zi Gege 1986787350 :250:168:200
#Lao Nanhai 918391635 :250:100:175
[root@oldboy63 ~]#awk '$0!~/^#|^$/' reg.txt
Zhang Dandan 41117397 :250:100:175
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
Wang Xiaoai 3515064655 :50:95:135
Li Youjiu 918391635 :175:75:300
[root@oldboy63 ~]#awk '!/^#|^$/' reg.txt
Zhang Dandan 41117397 :250:100:175
Meng Feixue 80042789 :250:60:50
[root@oldboy63 ~]#awk '!/^#|^$/{print $0}' reg.txt
Zhang Dandan 41117397 :250:100:175
6,显示Xiaoyu的捐款,每个捐款数额都是以"110"
[root@oldboy63 ~]#awk '$2~/Xiaoyu/{print $4}' reg.txt |sed 's#:#$#g'
$155$90$201
[root@oldboy63 ~]#awk '$2~/Xiaoyu/{print$1,$2, $4}' reg.txt |sed 's#:#$#g'
#Zhang Xiaoyu $155$90$201
[root@oldboy63 ~]#awk '$2~/Xiaoyu/{print$1,$2, $4}' reg.txt |tr ':' '$'
#Zhang Xiaoyu $155$90$201
[root@oldboy63 ~]#awk -F "[: ]+" '$2~/Xiaoyu/{print $1, $2, "$"$4,"$"$5,"$"$6}' reg.txt
#Zhang Xiaoyu $155 $90 $201
awk替换:
gsub =gawk substitute
gsub(/要替换的信息/,”替换成什么信息”.$第几列)
[root@oldboy63 ~]#awk '$2~/Xiaoyu/{gsub(/:/,"$",$4);print $4}' reg.txt
$155$90$201
[root@oldboy63 ~]#awk '$2~/Xiaoyu/{gsub(/:/,"$",$NF);print $NF}' reg.txt
$155$90$201
06awk命令模式分类
普通模式:比较模式
[root@oldboy63 ~]#awk 'NR==2' reg.txt NR==2: nr 表示文件行信息
#Zhang Xiaoyu 390320151 :155:90:201
[root@oldboy63 ~]#awk 'NR>2' reg.txt
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
[root@oldboy63 ~]#awk 'NR==2,NR==4' reg.txt
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
[root@oldboy63 ~]#awk 'NR==2;NR==4' reg.txt
Zhang Xiaoyu 390320151 :155:90:201
Wu Waiwai 70271111 :250:80:75
特殊模式: BEGIN {动作} :在处理文件之前先做什么事情
END{动作} :在文件处理后再做什么动作
[root@oldboy63 ~]#awk 'BEGIN{print "姓","名","号码","捐款记录"}{print $0}END{print "学生捐款登记表"}' reg.txt|column -t
姓 名 号码 捐款记录
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
学生捐款登记表
07用于运算:
[root@oldboy63 ~]#awk "BEGIN{print 2+2}"
4
[root@oldboy63 ~]#awk "BEGIN{print 2-2}"
0
[root@oldboy63 ~]#awk "BEGIN{print 2*2}"
4
[root@oldboy63 ~]#awk "BEGIN{print 3/2}"
1.5
[root@oldboy63 ~]#awk "BEGIN{print 3^2}"
9
[root@oldboy63 ~]#awk "BEGIN{print 3**2}"
9
[root@oldboy63 ~]#awk "BEGIN{print 3**3}"
27
[root@oldboy63 ~]#awk "BEGIN{print 5%3}"
2
修改内置变量:
NF: 取出最后一列
NR:表示行信息
-F:表示对区域进行分割,
FS:指定列分隔符, 默认识别空格为分割符
[root@oldboy63 ~]#awk '{print $NF}' reg.txt
:250:100:175
:155:90:201
:250:60:50
:250:80:75
:250:100:175
:50:95:135
:250:168:200
:175:75:300
:250:100:175
[root@oldboy63 ~]#awk '{print $(NF-2)}' reg.txt --- 取到数第二列
Dandan
Xiaoyu
Feixue
Waiwai
Bingbing
Xiaoai
Gege
Youjiu
Nanhai
[root@oldboy63 ~]#awk '{print $(NF-1)}' reg.txt
41117397
390320151
80042789
70271111
41117483
3515064655
1986787350
[root@oldboy63 ~]#awk 'BEGIN{FS="[:]+"}{print $1}' reg.txt
Zhang Dandan 41117397
Zhang Xiaoyu 390320151
Meng Feixue 80042789
Wu Waiwai 70271111
Liu Bingbing 41117483
Wang Xiaoai 3515064655
Zi Gege 1986787350
Li Youjiu 918391635
Lao Nanhai 918391635
[root@oldboy63 ~]#awk 'BEGIN{FS="[:]+"}{print $2}' reg.txt
250
155
250
[root@oldboy63 ~]#awk -voldboy=3 '{print $1,$oldboy}' reg.txt
Zhang 41117397
Zhang 390320151
Meng 80042789
Wu 70271111
Liu 41117483
Wang 3515064655
Zi 1986787350
Li 918391635
Lao 918391635
[root@oldboy63 ~]#awk -voldboy=3 '{print $1,oldboy}' reg.txt
Zhang 3
Zhang 3
Meng 3
Wu 3
Liu 3
Wang 3
Zi 3
Li 3
Lao 3
[root@oldboy63 ~]#awk -voldboy=3 '{print $1,"oldboy"}' reg.txt
Zhang oldboy
Zhang oldboy
Meng oldboy
[root@oldboy63 ~]#awk -vFS="[: ]+" '{print $4}' reg.txt
250
155
250
250
250
50
250
175
250
[root@oldboy63 ~]#awk -vFS="[: ]+" '{print $2,$4}' reg.txt
Dandan 250
Xiaoyu 155
Feixue 250
Waiwai 250
Bingbing 250
Xiaoai 50
Gege 250
Youjiu 175
Nanhai 250
统计:
END实际作用:将统计后的结果分析输出
[root@oldboy63 ~]#awk '/oldboy/' test.sh
oldboy
oldboy
oldboy
oldboy
oldboy
oldboy
[root@oldboy63 ~]#awk '/oldboy/{i=i+1;print i}' test.sh
1
2
3
4
5
6
![image.png](https://upload-images.jianshu.io/upload_images/18571001-0e0d6778590154a8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
[root@oldboy63 ~]#awk '/oldboy/{i=i+1}END{print i}' test.sh
6
[root@oldboy63 ~]#awk 'BEGIN{i=10}/oldboy/{i=i+1}END{print i}' test.sh
16
统计文件行数
[root@oldboy63 ~]#awk '/oldboy/{i=i+1}END{print i}' test.sh
6
[root@oldboy63 ~]#awk '/oldboy/{i++}END{print i}' test.sh
6
[root@oldboy63 ~]# seq 10 |awk '{sum=sum+$1;print sum}'
1
3
6
10
15
21
28
36
45
55
[root@oldboy63 ~]# seq 10 |awk '{sum=sum+$1}END{print sum}'
55
![image.png](https://upload-images.jianshu.io/upload_images/18571001-9fffa112fa043e2d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
[root@oldboy63 ~]#rz -E
rz waiting to receive.
[root@oldboy63 ~]# awk '/Failed/{i++}END{print i}' secure-20161219
367500
[root@oldboy63 ~]# awk '$6~/Failed/{i++}END{print i}' secure-20161219
367500
08. 课程知识梳理:
awk命令概念介绍: 语法 原理 BEGIN 处理文件 END
awk命令操作说明: 作用 查询 排除 替换
参数:
-F : 指定列分割符号
-v : 指定变量信息
动作:
print : 输出指定信息
gsub : 替换指定信息
符号:
~ : 匹配信息 按照指定列进行匹配
!~ : 将匹配的信息取反
// : 指定匹配信息
- awk命令模式分类
BEGIN{}: 处理文件前, 执行什么动作
END{}: 处理文件后, 执行什么动作
内置变量: FS NF NR --$0
- awk命令实现运算功能
累加公式: i=i+1 i++
求和运算: sum=sum+$n