三剑客之awk的基础用法
1.awk命令的概述:
gawk : pattern scanning and processing language
可以进行模式扫描 和 是一门语言
2.awk语法 : awk [参数] '模式{动作}' 文件
sed 语法:sed [参数] '条件 指令' 文件信息
3.awk命令的作用
处理文件信息:文本文件信息 日志文件信息 配置文件信息
处理文件方式: 排除信息 查询信息 统计信息 替换信息
对文件列进行处理
创建测试环境
[root@www ~]# cat reg.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:00
Li Youjiu 918391635 :175:75:300
01.显示xiaoyu的姓氏和ID号码
第一步:找出需要编辑模式信息 获取xiaoyu信息
[root@www ~]# awk '/Xiaoyu/' reg.txt
找出了文件中带xiaoyu的信息
Zhang Xiaoyu 390320151 :155:90:201
Li Youjiu Xiaoyu :175:75:300
[root@www ~]# awk '2~/xiaoyu/{动作}' reg.txt
awk '1,2~/Xiaoyu/{print 3}' reg.txt
Zhang 390320151
- 姓氏是Zhang的人,显示他的第二次捐款金额及他的名字
第一个步骤: 找出需要编写模式信息
awk '1~/Zhang/' reg.txt
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
第二个步骤: 根据条件做处理
[root@www ~]# awk '1,4}' reg.txt
Zhang Dandan :250:100:175
Zhang Xiaoyu :155:90:201
默认是以空格分的列 所以会显示第三列会显示所有数值
以冒号划分的列 参数-F 表示以什么划分 比如:以冒号":" 以冒号空格 ": "
awk -F ": " '1,4}' reg.txt
[root@www ~]# awk -F ":" '1,3}' reg.txt 以冒号划分的列
Zhang Dandan 41117397 250 100
Zhang Xiaoyu 390320151 155 90
[root@www ~]# cat reg.txt
第一列 第2列 第三列 第四列
Zhang Dandan 41117397 : 250 :100 :175
Zhang Xiaoyu 390320151 : 155 :90 :201
以冒号和空格划分
awk -F "[: ]+" '1,5}' reg.txt
[: ]+ 表示连续多个分隔符合并成成一个整体
答案:[root@www ~]# awk -F "[: ]+" '1,5}' reg.txt
Zhang Dandan 100
Zhang Xiaoyu 90
- 显示所有以41开头的ID号码的人的全名和ID号码
第一个步骤: 找出需要编写模式信息
awk '3~/^41/' reg.txt
Zhang Dandan 41117397 :250:100:175
Liu Bingbing 41117483 :250:100:175
第二个步骤: 根据条件做处理
awk '1,3}' reg.txt
[root@www ~]# awk '1,3}' reg.txt
Zhang Dandan 41117397
Liu Bingbing 41117483
[root@www ~]# awk '1,3}' reg.txt|column -t column -t :对齐显示
Zhang Dandan 41117397
Liu Bingbing 41117483 - 显示所有ID号码最后一位数字是1或5的人的全名
第一个步骤: 找出需要编写模式信息
找出第三列以1或5结尾的信息
方法一:[root@www ~]# awk '|53~/[15]3~/(1|5)3~/1/{print 2}' reg.txt
答案:[root@www ~]# awk '|51,3~/[15]1,$2}' reg.txt
Zhang Xiaoyu
Wu Waiwai
Wang Xiaoai
Li Youjiu - 获取文件中有井号或空行的内容, 将空行和井号信息的行排除
第一个步骤: 找出需要编写模式信息
awk '/#|^/' reg.txt
‘ #Wu Waiwai 70271111 :250:80:75
' #Wang Xiaoai 3515064655 :50:95:135
[root@www ~]# cat reg.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
方法二:[root@www ~]# awk '/' reg.txt
/#Wu Waiwai 70271111 :250:80:75
/#Wang Xiaoai 3515064655 :50:95:135
说明: $0 表示将文件所有列信息进行显示
awk '!/#|^/' reg.txt
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Liu Bingbing 41117483 :250:100:175
Zi Gege 1986787350:00
Li Youjiu 918391635 :175:75:300
Li Youjiu Xiaoyu :175:75:300
方法二:[root@www ~]# awk '/{print $0}' reg.txt
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Liu Bingbing 41117483 :250:100:175
Zi Gege 1986787350:00
Li Youjiu 918391635 :175:75:300
Li Youjiu Xiaoyu :175:75:300
- 显示Xiaoyu的捐款,每个捐款数额都是以110330
awk '4}' reg.txt|sed 's#:#2~/Xiaoyu/{print #g'
902~/Xiaoyu/{print "4,"5,"6}' reg.txt
90 将第几列)
操作:[root@www ~]# awk '",NF}' reg.txt
90NF 表示文件的最后一列信息 - awk命令模式分类
普通模式: 比较行信息
[root@www ~]# cat reg.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:00
Li Youjiu 918391635 :175:75:300
Li Youjiu Xiaoyu :175:75:300
[root@www ~]# awk 'NR>2' reg.txt 显示大于2行的信息
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:00
Li Youjiu 918391635 :175:75:300
Li Youjiu Xiaoyu :175:75:300
[root@www ~]# awk 'NR<2' reg.txt 显示小于2行的信息
Zhang Dandan 41117397 :250:100:175
说明: NR 表示文件行信息
取出多行信息
[root@www ~]# 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@www ~]# awk 'NR==2;NR==4' reg.txt
不连续多行 指定行的信息
Zhang Xiaoyu 390320151 :155:90:201
Wu Waiwai 70271111 :250:80:75
特殊模式:
BEGIN{动作}: 在处理文件之前,先做什么事情
[root@www ~]# awk 'BEGIN{print "姓","名","号码","捐款记录"}{print (NF-1)}' reg.txt --- 取出倒数第二列
NR: 表示行信息
FS: 指定列分隔符, 默认识别空格为分割符
[root@www ~]# awk 'BEGIN{FS="[: ]+"}{print 1,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:00
Li Youjiu 918391635 :175:75:300
Li Youjiu Xiaoyu :175:75:300
学生捐款登记表
实际作用:
可以将统计后的最终结果进行输出
-
awk对文件进行统计分析
- awk统计运算公式
a 文本信息累加运算
i=i+1
统计文件行数
awk '{i=i+1}END{print i}' test.txt
[root@www ~]# awk '/oldboy/{i=i+1}END{print i}' reg.txt
9
[root@www ~]# awk '/oldboy/{i++}END{print i}' reg.txt
9
数值信息求和运算
sum=sum+n 你要对文件第几列信息做求和运算
seq 10|awk '{sum=sum+$1}END{print sum}'
55
找出有faild信息, 总共出现了多少次 (awk统计)
难点: windows文件如何传输到linux系统
yum install -y lrzsz --- 实现windows和linux系统之间数据传输
rz -- 将windows数据 ---> linux系统
sz -- 将linux数据 ---> windows系统awk '/Failed/{i++}END{print i}' secure-20161219
awk '$6~/Failed/{i++}END{print i}' secure-20161219' - awk统计运算公式
课程知识重点
1) awk命令概念介绍: 语法 原理 BEGIN 处理文件 END
2) awk命令操作说明: 作用 查询 排除 替换
参数:
-F : 指定列分割符号
-v : 指定变量信息
动作:
print : 输出指定信息
gsub : 替换指定信息
符号:
~ : 匹配信息 按照指定列进行匹配
!~ : 将匹配的信息取反
// : 指定匹配信息
3) awk命令模式分类
BEGIN{}: 处理文件前, 执行什么动作
END{}: 处理文件后, 执行什么动作
内置变量: FS NF NR --n