返回顶部

zhangfd

个人博客,仅供学习使用

导航

Linux:三剑客之 awk

awk概念介绍说明

作用特点:
1. 排除信息
2. 查询信息
3. 统计信息
4. 替换信息
语法格式:
sed [参数] '条件-处理方式' 文件 
awk [参数] '模式-动作'     文件	

awk实际操作过程:

准备测试环境

[root@oldboyedu ~]# cat 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
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

命令查询信息方法:

按照行号查询信息:
awk 'NR=2' awk_test.txt
[root@oldboyedu ~]# awk 'NR=2' 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
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@oldboyedu ~]# awk 'NR==2' awk_test.txt
Zhang	Xiaoyu		390320151	:155:90:201
[root@oldboyedu ~]# 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@oldboyedu ~]# awk 'NR==2;NR==4' awk_test.txt
Zhang	Xiaoyu		390320151	:155:90:201
Wu	Waiwai		70271111	:250:80:75

ps: 在linux系统中
oldboy=10  	赋值变量信息
oldboy==2  	真正oldboy等于数值2
按照字符查询信息:
[root@oldboyedu ~]# awk '/Xiaoyu/' awk_test.txt
Zhang	Xiaoyu		390320151	:155:90:201
[root@oldboyedu ~]# awk '/Xiaoyu/,/Waiwai/' awk_test.txt
Zhang	Xiaoyu		390320151	:155:90:201
Meng	Feixue		80042789	:250:60:50
Wu	Waiwai		70271111	:250:80:75
[root@oldboyedu ~]# awk '/Xiaoyu/;/Waiwai/' awk_test.txt
Zhang	Xiaoyu		390320151	:155:90:201
Wu	Waiwai		70271111	:250:80:75

测验:

01. 显示xiaoyu的姓氏和ID号码(???)
[root@oldboyedu ~]# awk '/Xiaoyu/{print $1","$3}' awk_test.txt 
Zhang,390320151
[root@oldboyedu ~]# awk '/Xiaoyu/{print $1,$3}' awk_test.txt 
Zhang 390320151
02. 姓氏是zhang的人,显示他的第二次捐款金额及他的名字
[root@oldboyedu ~]# awk '/Zhang/{print $4}' awk_test.txt 
:250:100:175
:155:90:201
[root@oldboyedu ~]# awk '/Zhang/{print $NF}' awk_test.txt 
:250:100:175
:155:90:201
[root@oldboyedu ~]# awk '/Zhang/{print $NF}' awk_test.txt|awk -F ":" '{print $3}'
100
90

awk '/Zhang/{print $NF}' 
awk -F ":" '{print $3}'
[root@oldboyedu ~]# awk -F ":" '/^Zhang/{print $3}' awk_test.txt 
100
90

[root@oldboyedu ~]# awk -F "[ :]+" '/^Zhang/{print $1,$2,$5}' awk_test.txt 
Zhang Dandan 100
Zhang Xiaoyu 90
[root@oldboyedu ~]# awk -F "[ :]+" '/^Zhang/{print $1,$2,$(NF-1)}' awk_test.txt 
Zhang Dandan 100
Zhang Xiaoyu 90
03. 显示所有以41开头的ID号码的人的全名和ID号码
[root@oldboyedu ~]# awk '$3~/^41/{print $1,$2,$3}' awk_test.txt 
Zhang Dandan 41117397
Liu Bingbing 41117483
04. 显示所有ID号码最后一位数字是1或5的人的全名
方法一:
awk '$3~/1$|5$/{print $1,$2}' awk_test.txt
[root@oldboyedu ~]# awk '$3~/1$|5$/{print $1,$2}' awk_test.txt|column -t
Zhang  Xiaoyu
Wu     Waiwai
Wang   Xiaoai
Li     Youjiu
Lao    Nanhai
Lao    Nanhai
方法二:
[root@oldboyedu ~]# awk '$3~/[15]$/{print $1,$2}' awk_test.txt|column -t
方法三:
[root@oldboyedu ~]# awk '$3~/(1|5)$/{print $1,$2}' awk_test.txt|column -t
05. 显示Xiaoyu的捐款,每个捐款数值前面都有以$开头, 如$110$220$330
[root@oldboyedu ~]# awk '$2~/Xiaoyu/{print $NF}' awk_test.txt 
:155:90:201
[root@oldboyedu ~]# #gsub(/需要替换的信息/,"修改成什么信息",将哪列信息进行修改)
[root@oldboyedu ~]# awk '$2~/Xiaoyu/{gsub(/:/,"$",$NF);print $NF}' awk_test.txt 
$155$90$201

文件中空行进行排除/文件中注释信息进行排除
grep -Ev "^#|^$"  文件信息 
sed -n '/^#|^$/!p' 文件信息
awk '/^#|^$/'
[root@oldboyedu ~]# awk '$0~/^#|^$/'  awk_test.txt 
#Liu    Bingbing 41117483    :250:100:175

[root@oldboyedu ~]# 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
Lao    Nanhai   918394135   :250:100:175

总结:awk命令中$符号用法

$1 $2 $3 : 取第几列信息
$NF      : 取最后一列
$(NF-n)  : 取倒数第几列
$0       : 取所有列的信息

如何利用awk取出IP地址信息:
ip a s eth0|awk -F "[ /]+" 'NR==3{print $5}'
hostname -i 

awk高级功能说明

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

b 对日志信息数值进行求和 客户端-下载 服务端-上传 消耗网络流量

c (数组)进行排序分析

  排序
  01 192.168.2.1  600  192  深圳    10万   
  02 192.168.1.10 500  18   上海
  03 192.168.3.10 200  20   广州
                       30   东北    2千  
  运维总监---运营(推广)总监

d 可以进行脚本编写(循环语句 判断语句) sh awk_nginx.log

awk模式概念说明: 匹配的条件信息

普通的模式:

01. 正则表达式作为模式
    awk '/^oldboy/{print xx}'
02. 利用比较匹配信息
    NR==2
	NR>=2
    NR<=2
03. NR2,NR10

特殊的模式

BEGIN{} 在awk执行命令前做什么事情:
[root@oldboyedu ~]# awk 'BEGIN{print "姓","名","QQ号","捐款记录"}{print $0}' awk_test.txt |column -t
姓     名        QQ号        捐款记录
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
Lao    Nanhai    918394135   :250:100:175

修改内置分隔符变量
awk -F ":" '{print $2}' awk_test.txt
[root@oldboyedu ~]# awk  'BEGIN{FS=":"}{print $2}' awk_test.txt 
END{} 在awk执行命令结束之后做的操作
[root@oldboyedu ~]# awk 'BEGIN{print "姓","名","QQ号","捐款记录"}{print $0}END{print "操作结束"}' awk_test.txt |column -t 
姓        名        QQ号        捐款记录
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
Lao       Nanhai    918394135   :250:100:175
操作结束

统计累加运算测试:

01. 统计/etc/services文件中空行数量
利用awk公式进行累加运算
[root@oldboyedu ~]# i=0
[root@oldboyedu ~]# echo $((i=i+1))
1
[root@oldboyedu ~]# echo $((i=i+1))
2
[root@oldboyedu ~]# echo $((i=i+1))
3

awk '/^$/' /etc/service
[root@oldboyedu ~]# awk '/^$/{i=i+1;print i}' /etc/services 
空行 i=i+1 0+1  i=1
空行 i=i+1 1+1  i=2
空行 3
空行 4
空行 5
空行 6
空行 7
空行 8
空行 9
空行 10
空行 11
空行 12
空行 13
空行 14
空行 15
空行 16
空行 i=i+1 16+1 i=17 
[root@oldboyedu ~]# awk '/^$/{i=i+1}END{print i}' /etc/services 
17
02. 统计/etc/services文件中有井号开头的行
awk '/^#/{i++}END{print i}' /etc/services
03. 统计系统中有多少个虚拟用户 普通用户
第一个历程: 用户信息都保存在什么文件中了
用户信息保存文件: /etc/passwd
第二个历程: 从文件中匹配出虚拟用户 普通用户
匹配普通用户
awk '$NF~/bash/' /etc/passwd 
awk '$NF~/\/bin\/bash/' /etc/passwd 
第三个历程: 进行统计
普通用户数量
[root@oldboyedu ~]# awk '$NF~/bash/{i=i+1}END{print i}' /etc/passwd
63
虚拟用户数量
[root@oldboyedu ~]# awk '$NF!~/bash/{i=i+1}END{print i}' /etc/passwd
22
求和运算:
sum=sum+$n(需要进行数值求和的列)
[root@oldboyedu ~]# seq 10|awk '{sum=sum+$1;print sum}'
1  sum=sum+$1  0+1 sum=1
2  sum=sum+$1  1+2 sum=3
3  sum=sum+$1  3+3 sum=6
4              6+4 sum=10
5             10+5 sum=15
6             15+6 sum=21
7      28
8      36
9      45
10           45+10 sum=55
测试
 求出测试文件中 所有人第一次捐款的总额和第三次捐款总额
   显示表头 
   第一总额  第三次总额 	
   xxx        xxxx	 
   awk -F ":" 'BEGIN{print "第一次总额","第三次总额"};/.*/{print $2,$4}'  awk_test.txt
   [root@oldboyedu ~]# awk -F ":" 'BEGIN{print "第一次总额","第三次总额"}{a=a+$2;b=b+$4}END{print a,b}' awk_test.txt|column -t
   第一次总额  第三次总额
   2130        1661

posted on 2020-01-15 16:41  zhangfd  阅读(229)  评论(0编辑  收藏  举报