简介
一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。
语法
awk [选项参数] 'pattern1{action1} pattern2{action2}...' filename
pattern:表示AWK在数据中查找的内容,也就是匹配模式
action:在找到匹配内容时所执行的一系列命令
常用选项
-F | 定义分割符,默认为空格或tab,也可以使用正则来表示分割符,例如:-F "[ :]+" 表示遇见多空格或者多:统一看成一个分割 |
-v | 定义临时变量 |
-f | 指定awk执行脚本式的awk文件,例子:awk -f awk脚本文件 数据文件 |
内置变量
$0 | 记录变量,当前正在处理的记录 |
$n | 字段变量,其中n为整数,且n大于1,表示第n个字段的值。(列变量,$2即为第2列) |
NF | 整数值,表示当前记录(变量$0所代表的记录)的字段数(可以表示最后一列) |
NR | 整数值,表示awk已经读入的记录数(行变量) |
FILENAME | 表示正在处理的数据文件的名称 |
FS | 字段分隔符,默认值是空格或者制表符(列) |
RS | 记录分隔符,默认值是换行符,(行) |
匹配模式
以下案例以以下两个文件为主
[root@master test1]# cat data.txt
John 85 92 79 87
Mancy 89 90 73 82
Tom 81 88 92 81
Kity 79 65 83 90
Han 92 89 80 83
Kon 88 76 85 97
[root@master test1]# cat awk_test.txt
Zhao Dan 43917327 :210:103:145
Zhang Xiaoxue 3936742308 :125:90:201
Meng Lisha 4005427091 :220:60:50
Wu Xiaowei 702234141 :220:80:275
Liu Xiaobing 812117483 :230:101:154
Wang Xiaoli 3512424655 :50:95:135
Zhou Jiaxiang 1988989880 :153:198:221
Li Guangyu 9128380305 :175:75:230
关系表达式
简介
awk提供了许多关系运算符,如大于>、小于<或者等于==等,awk允许用户使用关系表达式作为匹配模式,当某个文本行满足关系表达式时,将会执行相应的操作。
注意以下例子的格式,awk是一行一行读取操作的,与sed相同
案例
1. 第二行大于90的显示所有内容
[root@centos7 ~]# awk '$2 > 90 {print}' data.txt
Han 92 89 80 83
解析:
print为打印前面匹配模式成功的结果
$2表示指定按默认空格分割的第二列
特殊:$0表示全部
2. 第二列大于90的显示第一列和第二列的内容
[root@centos7 ~]# awk '$2 > 90 {print $1,$2}' data.txt
Han 92
解析:
{}中也可以通过调用$n指定打印的列内容,其中","表示分割不同的列
正则表达式
简历
awk支持以正则表达式作为匹配模式,与sed一样,用户需要将正则表达式放在两条斜线中间,其基本语法如下:
注意以下格式,正则不仅在条件中可以使用,还可以在分割符中使用
条件正则
1. 输出以M或T开头的行
[root@centos7 ~]# awk '/^M|^T/{print}' data.txt
Mancy 89 90 73 82
Tom 81 88 92 81
解析:
语法格式 : awk '/条件正则/{行为}' 文件
分割正则
shadown文件内容
K3bsfOTa/LtJeR.:19531:0:99999:7:::
bin:*:18353:0:99999:7:::
daemon:*:18353:0:99999:7:::
1. 取出shadow中的过期后保留时间
[root@master test1]# awk -F "[:]+" '{print $(NF-1)}' shadow
7
7
7
解析:
-F 分割符
这里的[:]+ 采用正则形式,表示至少一个或多个:统一看成一个分割
NF为最后一列,我们取的的是导数第二列,所以减去一
混合表达式
简历
awk不仅支持单个的关系表达式或者正则表达式作为模式,还支持使用逻辑运算符“&&”“||”或者“!”,将多个表达式组合起来作为一个模式。
案例
1. 查询data.txt文件中,以K为首的行并且第三列大于70的行
[root@centos7 ~]# awk '/^K/&&$3 > 70{print}' data.txt
Kon 88 76 85 97
2. 查询data.txt文件中,以K为首或者第三列大于70的行
[root@master test1]# awk '/^K/ || $3>70 {print} ' data.txt
John 85 92 79 87
Mancy 89 90 73 82
Tom 81 88 92 81
Kity 79 65 83 90
Han 92 89 80 83
Kon 88 76 85 97
区间模式
简介
也就是说通过模式可以匹配一段连续的文本行,区间模式的语法如下:
awk 'pattern1,pattern2{action}' filename
案例
1. 获取data.txt文件中以Mancy开头的行到以第二列的值等于92的行之间的行内容
[root@centos7 ~]# awk '/^Mancy/,$2==92{print}' data.txt
Mancy 89 90 73 82
Tom 81 88 92 81
Kity 79 65 83 90
Han 92 89 80 83
2. 获取data.txt文件中以M开头的行到以H开头的行之前的行内容
[root@centos7 ~]# awk '/^M/,/^H/{print}' data.txt
Mancy 89 90 73 82
Tom 81 88 92 81
Kity 79 65 83 90
Han 92 89 80 83
3. 获取data.txt文件中第二列的值等于85到第三列的值为89的行之间的行内容
[root@centos7 ~]# awk '$2 == 85,$3 == 89{print}' data.txt
John 85 92 79 87
Mancy 89 90 73 82
Tom 81 88 92 81
Kity 79 65 83 90
Han 92 89 80 83
4. 获取awk_test.txt文件中第二列包含Xiaoxue和Xiaobing名字的行
[root@master test1]# awk '$2~/Xiaoxue/;$2~/Xiaobing/' awk_test.txt
Zhang Xiaoxue 3936742308 :125:90:201
Liu Xiaobing 812117483 :230:101:154
解析:
$n~ 表示以哪一列为限制域,后面跟着可跟正则或关系,对该域内容进行判定
注意:在使用区间模式时,一定要注意前后的边界,如果有多个行符合匹配模式,则awk会匹配第一次符合要求的行。
BEGIN模式
简介
BEGIN模式是一种特殊的内置模式,其成立的时机为awk程序刚开始执行,但是又尚未读取任何数据之前,因此,该模式所对应的操作仅仅被执行一次,当awk读取数据之后,BEGIN模式便不再成立,所以用户可以将与数据文件无关,而且在整个程序的生命周期内,只需执行一次的代码放在BEGIN模式对应的操作中。
案例
1. #修改awk内置变量 了解
awk -F: 'NR==1{print $1}' passwd
awk 'BEGIN{FS=":"} NR==1{print $1}' passwd
解析:
这里的FS指的是分割符变量,与-F意思相同
2. 在/etc/ssh/sshd_config中过滤出包含permitrootlogin或usedns的行,忽略大小写
awk 'BEGIN{IGNORECASE=1}/permitrootlogin|usedns/{print}' /etc/ssh/sshd_config
解析:这里的IGNORECASE=1开启忽略大小写
END模式
简介
END模式是awk的另外一种特殊模式,该模式成立的时机与BEGIN模式恰好相反,它是在awk命令处理完所有的数据,即将退出程序时成立,在此之前,END模式并不成立,无论数据文件中包含有多少行数据,在整个程序的生命周期中,该模式所对应的操作只被执行一次,因此,用户可以将许多善后工作放在END模式对应的操作中。
案例
1. 统计/etc/services 文件中空行的数量
awk '/^$/{j++} END{print j}' /etc/services
17
特殊意义的一些用法:
特殊一:列域
简介
判定某个列为域,以该域为内容,对其进行法则判定
语法:awk [选项] '$列号~/法则/{action}' filename
案例
1. 判定出awk_test.txt文件中第二列包含Xiaoxue和Xiaobing名字的行
[root@master test1]# awk '$2~/Xiaoxue/;$2~/Xiaobing/' awk_test.txt
Zhang Xiaoxue 3936742308 :125:90:201
Liu Xiaobing 812117483 :230:101:154
特殊二:替换符
简介
替换值中的某些指定的内容
语法:
awk [选项] '/法则/{gsub(/需要替换的内容/,"替换的内容",修改哪一列);print 列号}'
awk [选项] '$列号~/法则/{gsub(/需要替换的内容/,"替换的内容",修改哪一列);print 列号}'
案例
1. awk [选项] '$列号~/法则/{gsub(/需要替换的内容/,"替换的内容",修改哪一列);print 列号}'
[root@zhong ~]# awk '$2~/Xiaoxue/{print $NF}' awk_test.txt
:125:90:201
[root@zhong ~]# awk '$2~/Xiaoxue/{gsub(/:/,"$",$NF);print $NF}' awk_test.txt
$125$90$201