awk命令详解

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的全部内容了~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值