三剑客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

 

posted @ 2022-01-08 15:56  Yusir-SRE  阅读(60)  评论(0编辑  收藏  举报