昨天回顾
-
sed命令
-i修改放在所有参数的最后面常做修改前备份
sed -i.bak '条件信息a添加的内容' 文件名
今日总结
-
awk的执行原理
- awk基本参数
语法:awk [参数] ‘模式{动作}’ 文件
三剑客命令awk作用
处理文件信息:文本文件信息 日志文件信息 配置文件信息
处理文件方式:排除信息,查询信息,统计信息替换信息
对文件列进行处理
awk参数
-F 指定分隔符
-v 指定变量
动作
print 指定输出信息
gsub 指定替换
gsub(‘要替换的内容’,’替换成什么’,$第几列)
符号:
~:匹配信息,按指定列进行
!~:将指定信息取反操作
//:匹配指定的信息
awk指定模式
BEGIN{}处理文本之前执行动作
END{}处理文本之后执行动作
awk命令操作
测试环境
[root@oldboy63 ~]# cat regeix.txt
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
01显示Xiaoyu的姓氏和ID号码
[root@oldboy63 ~]# awk '$2~/Xiaoyu/{print $1,$3}' regeix.txt (注意只显示第二个字段的Xiaoyu所以用$2匹配)
Zhang 390320151
- 先查找模式(即条件)Xiaoyu
[root@oldboy63 ~]# awk '$2~/Xiaoyu/' regeix.txt
Zhang Xiaoyu 390320151 :155:90:201
- 根据条件进行处理显示姓氏和ID号码
[root@oldboy63 ~]# awk '$2~/Xiaoyu/{print $1,$3}' regeix.txt
Zhang 390320151
02.找到姓氏为Zhang的人,显示他的捐款金额及他的名字
[root@oldboy63 ~]# awk '$1~/Zhang/{print $1,$2,$4}' regeix.txt
Zhang Dandan :250:100:175
Zhang Xiaoyu :155:90:201
03.显示所有以41开头的ID号码的人及全人民
[root@oldboy63 ~]# awk '$3~/^41/{print $1,$2}' regeix.txt
Zhang Dandan
Liu Bingbing
04.显示所有ID号码最后一位是5或1的人的全名
[root@oldboy63 ~]# awk '$3~/1$|5$/{print $1,$2}' regeix.txt
Zhang Xiaoyu
Wu Waiwai
Wang Xiaoai
Li Youjiu
Lao Nanhai
05.获取文件中没有#号和空行的信息
环境
[root@oldboy63 ~]# cat test.txt
hang 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
Lao Nanhai Xiaoyu :250:100:175
方法一:直接使用!取反
[root@oldboy63 ~]# awk '!/#|^$/' test.txt
hang Dandan 41117397 :250:100:175
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
Lao Nanhai Xiaoyu :250:100:175
方法二:直接使用$1!~取反
[root@oldboy63 ~]# awk '$1!~/#|^$/' test.txt
hang Dandan 41117397 :250:100:175
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
Lao Nanhai Xiaoyu :250:100:175
06.显示Xiaoyu的捐款,每个捐款数都必须用$显示
方法一:awk+sed
[root@oldboy63 ~]# awk '/Xiaoyu/{print $NF}' regeix.txt |sed 's#:#$#g'
$155$90$201
方法二:awk
[root@oldboy63 ~]# awk -F ":" '/Xiaoyu/{print "$"$2"$"$3"$"$4}' regeix.txt
$155$90$201
方法三:awk+gsub参数
[root@oldboy63 ~]# awk '/Xiaoyu/{gsub(/:/,"$",$NF);print($NF)}' regeix.txt
$155$90$201
07.普通模式比较行信息
01 查找第二行以上的信息
[root@oldboy63 ~]# awk 'NR>2' regeix.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
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
02;取出多行信息
- 取出第二行和第四行信息
[root@oldboy63 ~]# awk 'NR==2;NR==4' regeix.txt
Zhang Xiaoyu 390320151 :155:90:201
Wu Waiwai 70271111 :250:80:75
- 取出第二行到第四行信息
[root@oldboy63 ~]# awk 'NR==2,NR==4' regeix.txt
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
7.5.2.2 特殊模式BEGIN和END模式
BEGIN处理文件之前,先做什么事情
[root@oldboy63 ~]# awk 'BEGIN{print "姓氏" " " "名字"" " "ID号码" " " "捐款钱数"}{print $0}' regeix.txt |column -t
姓氏 名字 ID号码 捐款钱数
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
BEGIN用于计算
[root@oldboy63 ~]# awk 'BEGIN{print 2%3}'
2
[root@oldboy63 ~]# awk 'BEGIN{print 2-3}'
-1
BEGIN用于修改内置变量
[root@oldboy63 ~]# awk 'BEGIN{FS="[ :]+"}/Xiaoyu/{print $4,$5,$6}' regeix.txt
155 90 201
[root@oldboy63 ~]# awk -vFS="[ :]+" '/Xiaoyu/{print $4,$5,$6}' regeix.txt
155 90 201
[root@oldboy63 ~]# awk -voldboy="4" '/Xiaoyu/{print oldboy}' regeix.txt
4
END在处理之后,在做什么事情
[root@oldboy63 ~]# awk '{print $0}END{print "学生捐款表"}' regeix.txt
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
学生捐款表
对行数进行统计
[root@oldboy63 ~]# awk '{i++}END{print i}' regeix.txt
9
对数值求值运算
[root@oldboy63 ~]# seq 10|awk '{sum=sum+$1}END{print sum}'
55