第一篇 awk简介与表达式实例
- 一种名字怪异的语言
- 模式扫描和处理,处理数据和生成报告 。
sed处理stream editor文本流,水流 。
一、awk环境简介
本文涉及的awk为gawk,即GNU版本的awk 。
[root@creditease awk]# cat /etc/redhat-releasecentos Linux release 7.5.1804 (Core)[root@creditease awk]# uname -r3.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 --versionGNU Awk 4.0.2二、awk的格式
awk指令是由模式、动作,或者模式和动作的组合组成 。
文章插图
文章插图
- 模式即pattern,可以类似理解成sed的模式匹配,可以由表达式组成,也可以是两个正斜杠之间的正则表达式 。比如NR==1,这就是模式,可以把它理解为一个条件 。
- 动作即action,是由在大括号里面的一条或多条语句组成,语句之间使用分号隔开 。如下awk使用格式 。
名称含义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]# awk -F "#" '{print $NF}' awk.txt GKL$123GKL$213GKL$321[root@creditease awk]# awk -F '[#$]' '{print $NF}' awk.txt 1232133213.2 条件动作基本的条件和动作
[root@creditease awk]# cat awk.txt ABC#DEF#GHI#GKL$123BAC#DEF#GHI#GKL$213CBA#DEF#GHI#GKL$321[root@creditease awk]# awk -F "#" 'NR==1{print $1}' awk.txtABC3.3 只有条件
[root@creditease awk]# awk -F "#" 'NR==1' awk.txtABC#DEF#GHI#GKL$123默认会有动作{print $0}
3.4 只有动作
[root@creditease awk]# awk -F "#" '{print $1}' awk.txtABCBACCAB默认处理所有行
3.5 多个模式和动作
[root@creditease awk]# awk -F "#" 'NR==1{print $NF}NR==3{print $NF}' awk.txt GKL$123GKL$3213.6 对$0的认识
awk中$0表示整行
[root@creditease awk]# awk '{print $0}' awk_space.txtABC DEF GHI GKL$123BAC DEF GHI GKL$213CBA DEF GHI GKL$3213.7 FNR
FNR与NR类似,不过多文件记录不递增,每个文件都从1开始(后边处理多文件会讲到)
[root@creditease awk]# awk '{print NR}' awk.txt awk_space.txt 123456[root@creditease awk]# awk '{print FNR}' awk.txt awk_space.txt 123123四、正则表达式与操作符
awk同sed一样也可以通过模式匹配来对输入的文本进行匹配处理 。awk也支持大量的正则表达式模式,大部分与sed支持的元字符类似,而且正则表达式是玩转三剑客的必备工具 。
awk支持的正则表达式元字符
文章插图
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$123BAC#DEF#GHI#GKL$213CBA#DEF#GHI#GKL$321[root@creditease awk]# awk -F "#" '{print $3}' awk.txt GHIGHIGHI[root@creditease awk]# awk -F "#" '{print $(NF-1)}' awk.txt GHIGHIGHI
推荐阅读
- 算法一看就懂之「 堆栈 」
- Android视频技术探索之旅:美团外卖商家端的实践
- 孕妇瑜伽要注意什么?
- 哪些茶称之为绿茶?
- 汽车之家|技术工程师的金三银四,没有消失
- 跑步之前吃什么好
- 武夷岩茶的闻香之法
- 茶之雅趣投茶介绍
- 国医大师何任的茶疗养生之道
- 新疆安集海大峡谷 被称为无人之境场面震撼