Linux三剑客之awk(1):awk简介与表达式示例

2020 年 2 月 10 日

Linux三剑客之awk(1):awk简介与表达式示例
  • 一种名字怪异的语言

  • 模式扫描和处理,处理数据和生成报告。


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


  • 模式即pattern,可以类似理解成sed的模式匹配,可以由表达式组成,也可以是两个正斜杠之间的正则表达式。比如NR==1,这就是模式,可以把它理解为一个条件。

  • 动作即action,是由在大括号里面的一条或多条语句组成,语句之间使用分号隔开。如下awk使用格式。


三、记录和域


名称含义
record记录,行
filed域,区域,字段,列


1)NF(number of field)表示一行中的区域(列)数量,$NF 取最后一个区域。


2)1,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$123  GKL$213  GKL$321  [root@creditease awk]# awk -F '[#$]' '{print $NF}' awk.txt   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]# awk -F "#" 'NR==1{print $NF}NR==3{print $NF}' awk.txt   GKL$123  GKL$321  
复制代码


3.6 对 $0 的认识


awk 中 $0 表示整行


[root@creditease awk]# awk '{print $0}' awk_space.txt  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


2020 年 2 月 10 日 21:05204

评论

发布
暂无评论
发现更多内容

我不想做一个架构师

彭灵俊

极客大学架构师训练营

架构培训-01学习总结 如何成为架构师

刘敏

软件架构学习记录

八两

食堂就餐卡系统设计

ruettiger

Week01 总结

一黑到底

架构师训练营-第1周命题作业

红了哟

架构师训练营-第一周-食堂就餐卡UML

人世间

极客大学架构师训练营 UML

第 1 周作业 - 食堂就餐卡系统设计

张小小的席大大

架构训练营0期总结--第一周

互金从业者X

作业一:食堂就餐卡系统设计

JI

极客大学架构师训练营

Wireshark的使用与数据分析(二)

姬翔

第一周作业--架构设计文档

CP

第一周作业-食堂就餐卡架构设计

molly

极客大学架构师训练营

什么叫架构师

平淡人生

极客大学架构师训练营

关于架构师这个角色的感悟

祝好

第 1 周食堂就餐卡系统设计

陆不得

食堂就餐卡系统架构设计文档

changtai

极客大学架构师训练营

架构视图学习总结

uangguan

「架构师训练营」20200606作业一:食堂就餐卡系统设计

极客

极客大学架构师训练营 食堂就餐卡系统设计

第一周总结

changtai

极客大学架构师训练营

编译运行Zookeeper源码

CoderLi

Java zookeeper 程序员 源码分析 后端

食堂就餐卡系统设计(第一周)

本周学习总结

ruettiger

作业一:食堂就餐卡系统设计

Coder

极客大学架构师训练营

食堂就餐卡系统设计

Acker飏

极客大学架构师训练营

聊聊架构师

Jerry Tse

随笔杂谈 极客大学架构师训练营 作业

作业一:食堂就餐卡系统设计

独孤魂

极客大学架构师训练营

架构视图

uangguan

第一周学习总结

架构师训练营0期第一周

Blink

第一周-学习总结

JI

极客大学架构师训练营

Linux三剑客之awk(1):awk简介与表达式示例-InfoQ