awk 用法介绍
欢迎来到 来到大浪涛天的博客 !
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
awk 用法介绍
1. awk概念介绍说明
作用特点:
- 排除信息
- 查询信息
- 统计信息
- 替换信息
2. 语法格式:
sed [参数] '条件-处理方式' 文件
awk [参数] '模式-动作' 文件
3. 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
3.1 命令查询信息方法:
- 按照行号查询信息:
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
- 按照字符查询信息:
[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
- 按照字符查询打印列:
- 显示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
- 姓氏是zhang的人,显示他的第二次捐款金额及他的名字
[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
- 显示所有以41开头的ID号码的人的全名和ID号码
[root@oldboyedu ~]# awk '$3~/^41/{print $1,$2,$3}' awk_test.txt
Zhang Dandan 41117397
Liu Bingbing 41117483
- 显示所有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
- 显示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取出IP地址信息:
ip a s eth0|awk -F "[ /]+" 'NR==3{print $5}'
hostname -i
4. awk命令中$符号用法
- $1 $2 $3 : 取第几列信息
- $NF : 取最后一列
- $(NF-n) : 取倒数第几列
- $0 : 取所有列的信息
5. awk高级功能说明
- 对日志信息进行统计(计数)
- 对日志信息数值进行求和 客户端-下载 服务端-上传 消耗网络流量
- (数组)进行排序分析
- 匹配的条件信息
- 普通的模式:
- 正则表达式作为模式
awk '/^oldboy/{print xx}'
- 利用比较匹配信息
NR==2 NR>=2 NR<=2 NR==2,NR==10
- 特殊的模式
- 正则表达式作为模式
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
操作结束
- 统计累加运算测试:
- 统计/etc/services文件中空行数量
[root@oldboyedu ~]# awk '/^$/{i=i+1;print i}' /etc/services
[root@oldboyedu ~]# awk '/^$/{i=i+1}END{print i}' /etc/services
17
-
统计/etc/services文件中有井号开头的行
awk '/^#/{i++}END{print i}' /etc/services
-
统计系统中有多少个虚拟用户 普通用户
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}'