Shell之文本三剑客awk命令

awk工具介绍

Awk是一个功能强大的编辑器,用于在Linux/UNIX下对文本和数据进行处理。数据可以来自一个或多个文件,也可以为其他命令的输出,常作为脚本来使用。在执行操作时,Awk逐行读取文本,默认以空格为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,对比该行是否与给定的模式相匹配,并按模式或者条件执行编辑命令,也可以脚本中调用编辑指令过滤输出相应的内容。

Awk的基本语法

Awk的两种语法格式:

awk【选项】 '模式或条件{编辑指令}' 文件1 文件2 
awk -f 脚本文件 文件1 文件2

在Awk语句中,模块不发决定何时对数据进行操作,若省略则后续动作时刻保持执行状态,模块可以为条件语句、复合语句或正则表达式等。每条编辑指令可以包含多条语句,多条语句之间要使用分号或者空格分隔的多个{}区域。常用选项-F定义字段分隔符,默认以空格或者制表符作为分隔符。
Awk提供了很多内置变量,经常用于处理文本。

变量描述
-F指定分隔符
-v自定义变量
-f脚本
FS指定每行文本的字段分隔符,缺省为空格或制表符
OFS输出时的分隔符
NF当前处理的行的字段个数
NR当前处理的行的行号(序号)
$0当前处理的行的整行内容
$n当前处理行的第n个字段(第n列)
FILENAME被处理的文件名
RS行分隔符。awk从文件上读取资料时,将根据RS的定义就把资料切割成许多条记录,而awk一次仅读入一条记录进行处理。预设值是\n

在Awk中,缺省的情况下总是将文本文件中的一行视为一个记录,而将一行中的某一部分作为记录中的一个字段。为了操作这些不同的字段,Awk借用Shell的方法,用1,2,3…这样的方式来顺序地表示行(记录)中的不同字段,例如:

[root@localhost ~]# awk -F: '{print $0,NF}' /etc/passwd

在这里插入图片描述

输出以冒号为分隔的/etc/passwd 文件中记录的字段,共7个字段,$1、$2、$3…$7。

示例:截取指定的列。

root@localhost ~]# df -Th |awk '{print$1,$6}'

在这里插入图片描述
用Awk截取命令df -Th输出的结果,不带任何条件(也就是执行所有内容),进行格式化输出,打印第1列和第6列数据。
特殊的,$0指当前处理的行的整行内容,换个意思是输出所有内。

[root@localhost ~]# awk '{print $0}' /etc/passwd

在这里插入图片描述
相当于

[root@localhost ~]# cat /etc/passwd

在这里插入图片描述

Awk用法示例

(1)打印文本内容

示例一:输出以root开头的行

[root@localhost ~]# awk '/^root/{print}' /etc/passwd

在这里插入图片描述
示例二:输出以nologin结尾的行

[root@localhost ~]# awk '/nologin$/{print}' /etc/passwd

在这里插入图片描述
示例三:统计可登录系统用户的个数。使用管道符调用命令wc -l 统计使用bash的用户个数即为可以,登录系统用户的个数

[root@localhost ~]# awk -F":" '/bash$/{print |"wc -l"}' /etc/passwd

在这里插入图片描述
或者使用grep查系统用户登录个数

[root@localhost ~]# grep "/bash$" /etc/passwd

在这里插入图片描述

Awk运算符

在使用Awk过程中,可以使用关系运算符作为“条件“,用于比较数字与字符串,运算符有大于(>)、小于(<)、大于等于(>=)、小于等于(<=)、等于(==)、不等于(!=);也可以使用逻辑操作符&&,表示”与“,||表示”或“,!表示”非“;还可以进行简单的数学运算加(+)、减(-)、乘(*)、除(/)、取余(%)、乘方(^)。只有当条件为真时候,才执行指定的动作。

示例一:输出第1行至第3行内容

[root@localhost ~]# awk 'NR==1,NR==3{print}' /etc/passwd

在这里插入图片描述
示例二:输出第1、3行内容

[root@localhost ~]# awk 'NR==1|| NR==3{print}' /etc/passwd

在这里插入图片描述
示例三:输出第1行到第3行内容

[root@localhost ~]# awk '(NR>=1)&&(NR<=3){print}' /etc/passwd

在这里插入图片描述
示例四:输出所有奇数行的内容

[root@localhost ~]# awk '(NR%2)==1{print}' /etc/passwd

在这里插入图片描述
示例五:输出所有偶数行的内容

[root@localhost ~]# awk '(NR%2)==0{print}' /etc/passwd

在这里插入图片描述
示例六:输出第3个字段不小于900的行,“!”号表示取反

[root@localhost ~]# awk -F: '!($3<900)' /etc/passwd

在这里插入图片描述

Awk条件表达式

在使用Awk过程中还可以使用条件表达式,条件表达式的运算涉及两个符号,冒号和问号,其实指就是if…else…语句的捷径,有着和if…else…相同的结果。
示例一:输出第3个字段大于200的行

[root@localhost ~]# awk -F: '{if($3>200){print$0}}' /etc/passwd

在这里插入图片描述
示例二:如果第3个字段的值大于第4个字段的值,则把问号前表达式的值赋值给max,否则就将冒号后那个表达式的值赋给max

[root@localhost ~]# awk -F: '{max=($3 > $4)? $3:$4;print max}' /etc/passwd

在这里插入图片描述
示例三:如果第3个字段的值大于200,则把第3个字段的值赋给max,否则就将第1个字段的值赋给max

[root@localhost ~]# awk -F: '{max=($3>200)?$3:$1;print max}' /etc/passwd

在这里插入图片描述

Awk按字段输出文本

示例一:输出处理数据的行号,每处理完一条记录,NR值加1

[root@localhost ~]# awk -F: '{print NR,$0}' /etc/passwd

在这里插入图片描述
示例二:输出第3列小于5的第1列与第3列数据

[root@localhost ~]# awk -F":" '{print $1$3}' /etc/passwd

在这里插入图片描述
示例三:输出包含7个字段,并且第1个字段中包含root的行的第1个与第2个字段内容

[root@localhost ~]# awk -F":" '($1~"root")&&(NF==7){print$1,$3}' /etc/passwd

在这里插入图片描述
示例四:输出第3行到第7行中以冒号为分隔符的第1列与第7列的数据

[root@localhost ~]# awk -F":" 'NR==3,NR==7{print$1,$7}' /etc/passwd

在这里插入图片描述
也可以输出数据时候插入一些文本标签:

[root@localhost ~]# awk -F":" 'NR==3,NR==7{print"USERNAME:" $1,"SHELL:" $7}' /etc/passwd

在这里插入图片描述

ot@localhost ~]# awk -F: '/^root/{print"Hi,"$1}' /etc/passwd

在这里插入图片描述

示例一:输出以冒号为分隔符且第7个字段中包含/bash的行的第1个字段

[root@localhost ~]# awk -F":" '$7~"/bash"{print $1}' /etc/passwd

在这里插入图片描述
示例二:保留原来的格式,输出以冒号为分隔,/etc/passwd文件的前4个字段

[root@localhost ~]# awk -F':' '{print $1":" $2":" $3":" $4}' /etc/passwd

在这里插入图片描述
示例三:输出以冒号为分隔符的第1列和第3列数据

[root@localhost ~]# awk -F":" '{print $1,$3}' /etc/passwd

在这里插入图片描述
或者

[root@localhost ~]# awk 'BEGIN{FS=":"}{print $1,$3}' /etc/passwd

在这里插入图片描述
在FS之前加一个BEGIN(注意:大写),当读取第一条数据之前,先把分隔符加上后再进去操作。相似的还有END,在所有数据处理完毕后执行。
示例一:统计以/bin/bash为结尾的行数

[root@localhost ~]# awk 'BEGIN{x=0};/\/bin\/bash$/{x++};END{print x}' /etc/passwd

在这里插入图片描述
Awk执行顺序:首先执行BEGIN{}中的操作;然后从指定的文件中逐行读取数据,自动更新NF、NR、$0、$1等内建变量的值,去s执行“模式或条件{编辑指令}” ;最后执行END{}中的后续操作。

Awk处理命令输出的结果

Awk也可以利用管道符“ | ” 处理命令的结果。

[root@localhost ~]# date |awk '{print"Month:"$2 "\nYear:",$6}'

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值