awk的语法格式
awk 指令是由模式,动作,或者模式和动作的组合
组成.
-
模式即 pattern,可以类似理解成 sed 的模式匹配,可以由表达式组成,也可以使两个正斜杠之间的正则表 达式.比如 NR==1,这就是模式,可以把他理解为一个条件.
-
动作即 action,是由在大括号里面的一条或多条语句组成,语句之间使用分号隔开,如下 awk 使用格式.
-
Action指的是动作,awk擅长文本格式化,且输出格式化后的结果,因此最常用的动作就是print.
awk模式、动作
测试数据
[zzx root ~]#echo cc{01..50} | xargs -n 5
cc01 cc02 cc03 cc04 cc05
cc06 cc07 cc08 cc09 cc10
cc11 cc12 cc13 cc14 cc15
cc16 cc17 cc18 cc19 cc20
cc21 cc22 cc23 cc24 cc25
cc26 cc27 cc28 cc29 cc30
cc31 cc32 cc33 cc34 cc35
cc36 cc37 cc38 cc39 cc40
cc41 cc42 cc43 cc44 cc45
cc46 cc47 cc48 cc49 cc50
写入文件,生成测试数据文件
echo cc{01..50} | xargs -n 5 > zzx.log
1.1 无模式只有动作
1. 直接输出源文件,所有内容
动作是 {print $0} 这个$0是表示列的数据,默认是表示一整行数据
关于字段的取值语法
是
$0 表示所有字段数据
$1 第一列数据
$2 第二列数据
依次类推
。。。
[242-yuchao-class01 root ~]#awk '{print $0}' test_awk.log
cc01 cc02 cc03 cc04 cc05
cc06 cc07 cc08 cc09 cc10
cc11 cc12 cc13 cc14 cc15
cc16 cc17 cc18 cc19 cc20
cc21 cc22 cc23 cc24 cc25
cc26 cc27 cc28 cc29 cc30
cc31 cc32 cc33 cc34 cc35
cc36 cc37 cc38 cc39 cc40
cc41 cc42 cc43 cc44 cc45
cc46 cc47 cc48 cc49 cc50
2.输出每一行数据,但是只要第一列的数据
awk '{print $1}' test_awk.log
3. 输出每一行数据,只要第二列的数据
awk '{print $2}' test_awk.log
4. 输出每一行数据,只要第一列和 第三列的数据
awk '{print $1,$3 }' test_awk.log
[zzx root ~]#awk '{print $1,$3 }' test_awk.log
cc01 cc03
cc06 cc08
cc11 cc13
cc16 cc18
cc21 cc23
cc26 cc28
cc31 cc33
cc36 cc38
cc41 cc43
cc46 cc48
1.2 行变量NR、匹配范围语法1.3
NR 行
直接打印这个内置变量,表示取当前行的号码
在开头显示行号
[zzx root ~]#awk '{print NR,$0}' test_awk.log
在结尾显示行号
[zzx root ~]#awk '{print $0,NR}' test_awk.log
NR== 等于行
打印第二行的所有字段数据
awk 'NR==2{print $0}' test_awk.log
打印第二行的,第1列,和第四列数据
[zzx root ~]#awk 'NR==2{print $1,$4}' test_awk.log
cc06 cc09
NR>= 大于等于行
NR<= 小于等于
1.3 列变量NF、每一列的字段
直接写NF变量表示每一行字段的总数
查看每一行有多少个字段
awk '{print $0,NF}' test_awk.log
$NF 输出最后一列
awk '{print $NF}' test_awk.log
$(NF-1) 输出倒数第2列
1.4 只有模式,不写动作
提取前五行的数据,请务必加上动作,且显示行号在前面
awk 'NR<=5{print NR,$0}' test_awk.log
awk内置变量
2.2 关于行的内置变量,RS、ORS
-
RS和ORS
-
RS、输入记录分隔符,决定awk如何分隔每一行(默认是\n)
-
ORS,输出记录分隔符,决定awk如何输出每一行(默认是\n)
-
2.3 关于列的内置变量,FS、OFS
-
FS和OFS
-
FS是输入字段分隔符,决定awk输入数据后的每一个字段分隔符是什么,默认是空格
-
OFS是输出字段分隔符,决定awk输出每个字段的分隔符是什么,默认是空格
-
awk特殊模式BEGIN和END
3.3 BEGIN模式
-
BEGIN模式作用是在awk开始读取文件行数据、之前就先执行,一般用于预定义一些操作,比如数据的表头格式化等。
-
BEGIN后面必须跟上action动作
3.3.1 BEGIN打印
语法
awk 'BEGIN{print "你好"}{print $0}'
显示/etc/passwd前五行,且加上打印BEGIN动作,打印"awk正在执行中" 表头
awk ' BEGIN{print "awk正在执行中" } NR<=5 {print $0}' /etc/passwd
3.4 END模式
-
和BEGIN相反,END就是awk结束后的操作
-
END是awk读取完所有的文件后,再执行END模块,一般用来总结、格式化打印一个结果
-
END仅会在awk所有行数据处理完毕后,执行END动作。
3.4.1 END打印
提取系统前五个用户的,用户名、uid、gid、家目录、登录解释器、设置为表头
且结束后提示,awk已经处理完毕
root: x: 0: 0: root: /root: /bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
awk -v FS=':' 'BEGIN{print "用户名","uid","gid","家目录","登录解释器" }NR<=5{print $1,$3,$4,$6,$7}END{print "awk已经处理完毕"}' /etc/passwd
以上就是awk的全部内容了~~~