一种名字怪异的语言
模式扫描和处理,处理数据和生成报告。
awk 不仅仅是 linux 系统中的一个命令,而且是一种编程语言;它可以用来处理数据和生成报告(excel);处理的数据可以是一个或多个文件;可以是直接来自标准输入,也可以通过管道获取标准输入;awk 可以在命令行上直接编辑命令进行操作,也可以编写成 awk 程序来进行更为复杂的运用。
sed 处理 stream editor 文本流,水流。
一、awk 环境简介
本文涉及的 awk 为 gawk,即 GNU 版本的 awk。
[root@creditease awk]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
[root@creditease awk]# uname -r
3.10.0-862.el7.x86_64
[root@creditease awk]# ll `which awk`
lrwxrwxrwx. 1 root root 4 Nov 7 14:47 /usr/bin/awk -> gawk
[root@creditease awk]# awk --version
GNU Awk 4.0.2
复制代码
二、awk 的格式
awk 指令是由模式、动作,或者模式和动作的组合组成。
1560503445878058229.png
1560503451239021614.png
三、记录和域
名称 | 含义 |
---|
record | 记录,行 |
filed | 域,区域,字段,列 |
1)NF(number of field)表示一行中的区域(列)数量,$NF 取最后一个区域。
2)符号表示取某个列(区域),1,2,NF
3)NR (number of record) 行号,awk 对每一行的记录号都有一个内置变量 NR 来保存,每处理完一条记录 NR 的值就会自动+1
4)FS(-F)field separator 列分隔符,以什么把行分隔成多列
3.1 指定分隔符
[root@creditease awk]
GKL$123
GKL$213
GKL$321
[root@creditease awk]
123
213
321
复制代码
3.2 条件动作基本的条件和动作
[root@creditease awk]# cat awk.txt
ABC#DEF#GHI#GKL$123
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
[root@creditease awk]# awk -F "#" 'NR==1{print $1}' awk.txt
ABC
复制代码
3.3 只有条件
[root@creditease awk]# awk -F "#" 'NR==1' awk.txt
ABC#DEF#GHI#GKL$123
复制代码
默认会有动作{print $0}
3.4 只有动作
[root@creditease awk]# awk -F "#" '{print $1}' awk.txt
ABC
BAC
CAB
复制代码
默认处理所有行
3.5 多个模式和动作
[root@creditease awk]
GKL$123
GKL$321
复制代码
3.6 对 $0 的认识
awk 中 $0 表示整行
[root@creditease awk]
ABC DEF GHI GKL$123
BAC DEF GHI GKL$213
CBA DEF GHI GKL$321
复制代码
3.7 FNR
FNR 与 NR 类似,不过多文件记录不递增,每个文件都从 1 开始(后边处理多文件会讲到)
[root@creditease awk]# awk '{print NR}' awk.txt awk_space.txt
1
2
3
4
5
6
[root@creditease awk]# awk '{print FNR}' awk.txt awk_space.txt
1
2
3
1
2
3
复制代码
四、正则表达式与操作符
awk 同 sed 一样也可以通过模式匹配来对输入的文本进行匹配处理。 awk 也支持大量的正则表达式模式,大部分与 sed 支持的元字符类似,而且正则表达式是玩转三剑客的必备工具。
awk 支持的正则表达式元字符
1560935853405075157.png
awk 默认不支持的元字符,和需要添加参数才能支持的元字符
元字符 | 功能 | 示例 | 解释 |
---|
x{m} | x重复m次 | /cool{5}/ | 需要注意一点的是,cool加括号或不加括号的区别,x可以使字符串也可以只是一个字符,所以/cool{5}/表示匹配coo再加上5个l,即coolllll。/(cool){2,}/表示匹配coolcool,coolcoolcool等。 |
x{m,} | x重复至少m次 | /(cool){2,}/ | 同上 |
x{m,n} | x重复至少m次,但不超过n次,需要指定参数:–posix或者–re-interval。没有该参数不能使用这种模式 | /(cool){5,6}/ | 同上 |
正则表达式的运用,默认是在行内查找匹配的字符串,若有匹配则执行 action 操作,但是有时候仅需要固定的列表匹配指定的正则表达式。
比如:
我想取/etc/passwd 文件中第五列($5)这一列查找匹配 mail 字符串的行,这样就需要用另外两个匹配操作符。并且 awk 里面只有这两个操作符来匹配正则表达式的。
4.1 正则实例
1)显示 awk.txt 中 GHI 列
[root@creditease awk]# cat awk.txt
ABC#DEF#GHI#GKL$123
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
[root@creditease awk]# awk -F "#" '{print $3}' awk.txt
GHI
GHI
GHI
[root@creditease awk]# awk -F "#" '{print $(NF-1)}' awk.txt
GHI
GHI
GHI
复制代码
2)显示包含 321 的行
[root@creditease awk]# awk '/321/{print $0}' awk.txt
CBA#DEF#GHI#GKL$321
复制代码
3)以 #为分隔符,显示第一列以 B 开头或最后一列以 1 结尾的行
[root@creditease awk]# awk -F "#" '$1~/^B/{print $0}$NF~/1$/{print $0}' awk.txt
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
复制代码
4)以 #为分隔符,显示第一列以 B 或 C 开头的行
[root@creditease awk]# awk -F "#" '$1~/^B|^C/{print $0}' awk.txt
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
[root@creditease awk]# awk -F "#" '$1~/^[BC]/{print $0}' awk.txt
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
[root@creditease awk]# awk -F "#" '$1~/^(B|C)/{print $0}' awk.txt
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
[root@creditease awk]# awk -F "#" '$1!~/^A/{print $0}' awk.txt
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
复制代码
五、比较表达式
awk 是一种编程语言,能够进行更为复杂的判断,当条件为真时,awk 就执行相关的 action,主要是在针对某一区域做出相关的判断,比如打印成绩在 80 分以上的,这样就必须对这一个区域作比较判断.
下表列出了 awk 可以使用的关系运算符,可以用来比较数字字符串,还有正则表达式,当表达式为真的时候,表达式结果为 1,否则为 0,只有表达式为真,awk 才执行相关的 action。
awk 支持的关系运算符
运算符 | 含义 | 示例 |
---|
< | 小于 | x>y |
<= | 小于或等于。 | x<=y |
== | 等于 | x==y |
!= | 不等于 | x!=y |
>= | 大于或等于 | x>=y |
> | 大于 | x<y |
5.1 比较表达式实例
显示 awk.txt 的第 2 ,3 行
NR //,//
[root@creditease awk]# awk 'NR==2{print $0}NR==3{print $0}' awk.txt
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
[root@creditease awk]# awk 'NR>=1{print $0}' awk.txt
ABC#DEF#GHI#GKL$123
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
[root@creditease awk]# awk '/BAC/,/CBA/{print $0}' awk.txt
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
复制代码
本文转载自宜信技术学院网站。
原文链接:http://college.creditease.cn/detail/260
评论