三剑客-awk

1.作用特点

排除信息

查询信息

统计信息

替换信息

2.语法格式

awk [参数] ‘模式-动作’ 文件

3.awk命令执行原理

4.命令使用方法

创建测试环境

[root@shuai ~]# cat >>awk_test.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
EOF
(1)命令查询信息:
[root@shuai ~]# awk 'NR==2' awk_test.txt   (显示文件第二行内容)
Zhang  Xiaoyu            390320151    :155:90:201
[root@shuai ~]# 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
[root@shuai ~]# awk 'NR==2;NR==4' awk_test.txt (显示文件第二,第四行内容)
Zhang  Xiaoyu            390320151    :155:90:201
Wu     Waiwai            70271111    :250:80:75
说明:在Linux系统中

A=2 赋值变量信息

A==2 真正A=2

B:按照字符查询信息:
[root@shuai ~]# awk '/Xiaoyu/' awk_test.txt     (查找有Xiaoyu的行)
Zhang  Xiaoyu            390320151    :155:90:201 
[root@shuai ~]# awk '/Xiaoyu/,/Waiwai/' awk_test.txt  (查找Xiaoyu到Waiwai的行)
Zhang  Xiaoyu            390320151    :155:90:201
Meng   Feixue            80042789    :250:60:50
Wu     Waiwai            70271111    :250:80:75
[root@shuai ~]# awk '/Xiaoyu/;/Waiwai/' awk_test.txt (查找Xiaoyu和Waiwai的行)
Zhang  Xiaoyu            390320151    :155:90:201
Wu     Waiwai            70271111    :250:80:75
(2)练习题:

1.显示xiaoyu的姓氏和ID号码

[root@shuai ~]# awk '/Xiaoyu/{print $1,$3}'  awk_test.txt 
Zhang 390320151

2.姓氏是zhang的人,显示他的第二次捐款金额及他的名字

[root@shuai ~]# awk -F " |:" '/Zhang/{print $1,$3,$9}' awk_test.txt 
Zhang Dandan         100
Zhang Xiaoyu         90
[root@shuai ~]# awk -F "[ :]" '/Zhang/{print $1,$3,$9}' awk_test.txt 
Zhang Dandan         100
Zhang Xiaoyu         90
[root@shuai ~]# awk -F "[ :]+" '/Zhang/{print $1,$2,$5}' awk_test.txt 
Zhang Dandan         100
Zhang Xiaoyu         90

3.显示所有以41开头的ID号码的人的全名和ID号码

[root@shuai ~]# awk '$3~/^41/{print $1,$2,$3}' awk_test.txt 
#PS:$3~/^41/表示匹配第三列以41开头的
Zhang Dandan 41117397
Liu Bingbing 41117483

4.显示所有ID号码最后一位数字是1或5的人的全名

[root@shuai ~]# awk '$3~/[1,5]$/{print $1,$2}' awk_test.txt 
Zhang Xiaoyu
Wu Waiwai
Wang Xiaoai
Li Youjiu
Lao Nanhai

5.显示Xiaoyu的捐款,每个时都有以$开头, 如$110$220$330

[root@shuai ~]# awk '/Xiaoyu/{gsub(/:/,"$",$NF);print $4}' awk_test.txt 
$155$90$201

6.删除文件空行

[root@shuai ~]# awk '$0~!/^#|^$/' awk_test.txt

7.取ip地址

[root@shuai ~]#  ip a s eth0 | awk -F "[ /]+" 'NR==3{print $3}'
10.0.0.200
总结:

gusb使用方法gsub(/需要替换的内容/,”替换成什么”,需要替换那列) ​

$NF表是最后一列

​$(NF-1)倒数第二列 ​

$0表示整列

5.awk高级功能说明

(1)对日志信息进行统计(计数)

(2)对日志信息进行求和

(3)(数组)进行排序分析

(4)可以进行脚本编写(循环语句 判断语句)

6.awk模式概念说明

普通模式:

01.正则表达式作为模式

awk ‘/^shuai/’ awk_test.txt

02.利用比较匹配信息

NR==2 显示第二列

NR>2 显示第三列到最后一列

NR<2 显示第一列

03.范围模式

NR==2,NR==4 显示第二列到第四列

特殊模式

BEGIN{print } 在awk执行命令前做什么事情,还可以做计算,修改内置变量

[root@shuai ~]# awk 'BEGIN{print "姓","名","ID","捐款记录"}{print $0}' awk_test.txt |column -t姓     名        ID          捐款记录
Zhang  Dandan    41117397    :250:100:175
Zhang  Xiaoyu    390320151   :155:90:201
[root@shuai ~]# awk 'BEGIN {print 1+1}'
2
[root@shuai ~]# awk 'BEGIN{FS=":"}{print $2}' awk_test.txt 
250
155

END{print } 在awk执行命令之后做的事情

[root@shuai ~]# 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
执行结束

练习题:

1.统计/etc/services有多少空行

[root@shuai ~]# awk '/^$/{i++}END{print i}' /etc/services 
17

2.统计系统中有多少个虚拟用户

[root@shuai ~]# awk '$NF~/nologin$/{i++}END{print i}' /etc/passwd
20

3.统计每个人三次共捐了多少钱

[root@shuai ~]# awk -F "[ :]+" '{sum=$4+$5+$6;print sum}'  awk_test.txt 
525
446
360
405
525
280
618
550
525

4.统计所有人第一次捐款的总额和第三次捐款的总额,并显示表头

[root@shuai ~]# awk -F "[ :]+" 'BEGIN{print"第一次总计捐款","第二次总计捐款"}{sum=sum+$4;i=i+$6}END{print sum,i}'  awk_test.txt |column -t
第一次总计捐款  第二次总计捐款
1880            1486

 

[root@shuai ~]# awk -F "[ :]+" '{sum=$4+$5+$6;print sum}' awk_test.txt 525 446 360 405 525 280 618 550 525

posted @ 2021-05-14 09:50  张福帅  阅读(51)  评论(0)    收藏  举报