三剑客awk
1. awk概念介绍说明
1) 作用特点:
1.排除信息
2.查询信息
3.统计信息
4.替换信息
2) 语法格式:
awk 参数 '模式-动作' 文件信息
参数: -F 定义什么符号为判断列的分隔符 用法:-F"符号"
动作指令:print 输出 用法:{print $某列}
gsub 替换 用法:gsub(/需要替换的信息/,"修改成什么信息",将哪列信息进行修改)
awk符号总结:
$1 $2: 取第几列信息
$NF : 取最后一列信息
$(NF-1) :取倒数第几列信息
$0 :取所有列信息
3) awk实践操作过程
测试环境:
姓 名 ID号码 捐款
Zhang Dandan 41117397 :250:100 :75
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100 :75
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:75
01. awk命令查询信息:
a.按照行号查询:
1.单行查询
[root@HGG ~]# awk 'NR==2' awk_test.txt
Zhang Xiaoyu 390320151 :155:90:201
2.多行查询(连续)
[root@HGG ~]# awk 'NR==2,NR==4' awk_test.txt
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
3.多行查询(不连续)
[root@HGG ~]# awk 'NR==2;NR==4' awk_test.txt
Zhang Xiaoyu 390320151 :155:90:201
Wu Waiwai 70271111 :250:80:75
b按照字符查询
[root@HGG ~]# awk '/Xiaoyu/' awk_test.txt
Zhang Xiaoyu 390320151 :155:90:201
02.测验
1.显示Xiaoyu的姓氏和ID号码 (print)
[root@HGG ~]# awk '/Xiaoyu/{print $1,$3}' awk_test.txt --print中的逗号代表空格
Zhang 390320151
[root@HGG ~]# awk '/Xiaoyu/{print $1","$3}' awk_test.txt --","代表输出真的逗号
Zhang,390320151
2.姓氏是Zhang的人,显示他的第二次捐款金额以及名字( -F)
方法一:
[root@HGG ~]# awk '/Zhang/{print $4}' awk_test.txt| awk -F ":" '{print $3}'
100
90
[root@HGG ~]# awk '/Zhang/{print $NF}' awk_test.txt| awk -F ":" '{print $3}' --print中的NF表示倒数第一行
100
90
方法二:(简化)
[root@HGG ~]# awk -F ":" '/Zhang/{print $3}' awk_test.txt --内容中第一个冒号之前是一个整体
100
90
完整答案方法一:([]+)
[root@HGG ~]# awk -F "[ :]+" '/Zhang/{print $1,$2,$5}' awk_test.txt --[ :]+ 表示以空格跟:为分隔符
Zhang Dandan 100
Zhang Xiaoyu 90
完整答案方法二:
[root@HGG ~]# awk -F "[ :]+" '/Zhang/{print $1,$2,$(NF-1)}' awk_test.txt --$(NF-1)代表倒数第二行
Zhang Dandan 100
Zhang Xiaoyu 90
3.显示所有以41开头的ID号码的人的全名和ID号码
[root@HGG ~]# awk '$3~/^41/{print $1,$2,$3}' awk_test.txt ---$3~代表指定第三列的信息查询
Zhang Dandan :250:100:175
Liu Bingbing :250:100:175
4.显示所有ID号码最后一位数字是1或5的全名
方法一:
[root@HGG ~]# awk '$3~/1$|5$/{print $1,$2}' awk_test.txt |column -t ---column -t 代表对齐
Zhang Xiaoyu
Wu Waiwai
Wang Xiaoai
Li Youjiu
Lao Nanhai
方法二:
[root@HGG ~]# awk '$3~/[15]$/{print $1,$2}' awk_test.txt |column -t
Zhang Xiaoyu
Wu Waiwai
Wang Xiaoai
Li Youjiu
Lao Nanhai
5.显示Xiaoyu的捐款,每次捐款都要有以$开头(gsub)
[root@HGG ~]# awk '$2~/Xiaoyu/{gsub(/:/,"$",$4);print $4}' awk_test.txt
$155$90$201
6.文件中空行排除,文件中的注释信息进行排除
方法一:
[root@HGG ~]# awk '$0!~/^$|^#/' awk_test.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
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@HGG ~]# awk '!/^$|^#/' awk_test.txt
2、awk的高级功能
1)功能说明
a 对日志信息进行统计(计数)
b 对日志信息数值进行求和 客户端-下载 服务端-上传 消耗网络流量
c (数组)进行排序分析
通过ip(每个地区ip不一样)统计不同地区ip的访问数
d 可以进行脚本编写(循环语句 判断语句)
2)awk模式概念说明:匹配条件的信息
a 普通模式
01.正则表达式作为模式
awk '/^hgg/{print xxx}'
02、利用比较匹配信息
NR==0
NR>=2
NR<=2
NR==2,NR==10
b 特殊模式
需求01:BEGIN{} 在awk执行命令之前做什么事情
[root@HGG ~]# awk 'BEGIN{print "姓","名","id号","捐款记录"}{print $0}' awk_test.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
需求02:修改内置分隔符变量
awk -F":" '{print $2}' awk_test.txt
• awk 'BEGIN{FS=":"}{print $2}' awk_test.txt
awk -vFS=":" '{print $2}' awk_test.txt
需求03 :END{}在awk执行命令之后做什么事
[root@HGG ~]# awk 'BEGIN{print "姓","名","id号","捐款记录"}{print $0}END{print "操作结束"}' awk_test.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
操作结束
需求04:统计文件中空行
[root@HGG ~]# awk '/^$/{i=i+1;print i}' /etc/services
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@HGG ~]# awk '/^$/{i=i+1}END{print i}' /etc/services
17
需求05:统计系统中有多少个虚拟用户
第一个历程:用户存在什么文件中
/etc/passwd
第二个历程:从文件中匹配出虚拟用户--普通用户
[root@HGG ~]# awk '$NF~/bash/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
hgg:x:1000:1000:Hgg:/home/hgg:/bin/bash
第三个历程:进行统计
普通用户数量
[root@HGG ~]# awk '$NF~/bash/{i=i+1}END{print i}' /etc/passwd
2
虚拟用户数量
[root@HGG ~]# awk '$NF!~/bash/{i=i+1}END{print i}' /etc/passwd
20
需求06:求和
[root@HGG ~]# seq 10|awk '{sum=sum+$1;print sum}'
1
3
6
10
15
21
28
36
45
55