1、awk概述
awk不仅仅是Linux系统中的一个命令,而且是一种编程语言
它可以用来处理数据和生成报告(excel)
处理的数据可以是一个或多个文件
可以使直接来自标准输入、也可以是通过管道获取标准输入
awk可以在命令行上直接编辑命令进行操作,也可以写成awk程序来进行更为复杂的操作
2、awk环境简介
3、awk的格式
awk指令是由模式、动作、或者模式和动作的组合组成
- pattern即模式:可以类似理解成sed的模式匹配,可以由表达式组成,也可以是两个正斜杠之间的正则表达式。如果NR==1,这就是模式,可以理解为一个条件
- action即动作:是由在大括号里面的一条或多条语句组成,语句之间使用分号隔开
4、记录和域
名称 | 含义 |
---|---|
record | 记录,行 |
filed | 域,区域,字段,列 |
- NF(number of field):表示一行中的区域(列)数量,$NF取最后一个区域
- $ 符号:表示取某个列(区域),如:$1,$2,$NF
- NR(number of record):表示行号,awk对每一行的记录号都有一个内置变量NR来保存,每处理完一条记录NR的值都会自动 +1
- FS(-F)field separator:列分隔符,以什么把行分割成多列
4.1 指定分隔符
4.2 条件和动作
4.3 只有条件
4.4 只有动作
默认处理所有行
4.5 多个模式和动作
4.6 $0
awk中$0表示整行
4.7 FNR
FNR与NR类似,不过文件记录不递增,每个文件都从1开始
5、正则表达式与操作符
awk同sed一样也可以通过模式匹配来对输入的文本进行匹配处理
awk也支持大量的正则表达式模式,大部分与sed支持的元字符类似
awk支持的正则表达式元字符
awk默认不支持的元字符,和需要添加参数才能支持的元字符
正则表达式的运用,默认是在行内查找匹配的字符串,若有匹配则执行action操作,但是有时候仅需要固定的列表匹配指定的正则表达式
如:
想取/etc/passwd文件中第5列($5)这一列查找匹配mail字符串的行,这样就需要用另外两个匹配操作符。并且awk里面只有这两个操作符来匹配正则表达式
正则匹配操作符 | 说明 |
---|---|
~ | 用于对记录或区域的表达式进行匹配。 |
!~ | 用于表达与~相反的意思。 |
正则实例
1)显示awk.txt中GHI列
2)显示包含321的行
显示所有列,可以什么都不用加
3)以#为分隔符,显示第一列以B开头或最后一列以1结尾的行
- $1:第一列
- ~:匹配
- /^B/:以B开头
- {print}:打印
- $NF:最后一列
- ~:匹配
- /1$/:以1结尾
- {print}:打印
4)以#为分隔符,显示第一列以B或C开头的行
6、比较表达式
awk是一种编程语言,能够进行更为复杂的判断,当条件为真时,awk就执行相关的action,主要是在针对某一区域做出相关的判断,如打印成绩在80分以上的,这样就必须对这个区域做比较判断
下表列出了awk可以使用的关系运算符,可以用来比较数字字符串,还有正则表达式,当表达式为真的时候,表达式结果为1,否则为0,只有表达式为真,awk才执行相关的action。
awk支持的关系运算符
运算符 | 含义 | 示例 |
---|---|---|
< | 小于 | x>y |
<= | 小于或等于。 | x<=y |
== | 等于 | x==y |
!= | 不等于 | x!=y |
>= | 大于或等于 | x>=y |
> | 大于 | x<y |
显示awk.txt的第2,3行