查看原文
其他

正则表达式(8)-三剑客之awk(3)

Cloud研习社 Cloud研习社 2023-06-06


每周二、四、六定期更新!




awk操作符


算术运算:

这部分和前面介绍shell的算术运算是一样的,我们不做详细介绍。


x+y 加法
x-y 减法
x*y 乘法
x/y 除法
x^y 异或
x%y 取余


赋值操作:这部分也和前面介绍shell的算术运算是一样的,我们不做详细介绍。


= -= += *= /= %= ^= ++ --


看个例子吧:

[root@studyclub script]# awk 'BEGIN{i=0; print i++,i}'
0 1
[root@studyclub script]# awk 'BEGIN{i=0; print ++i,i}'
1 1


根据上面两个例子的结果,请自行回顾++符号在变量前和变量后的区别。
比较操作:
== 等于
!= 不等于
> 大于
>= 大于等于
< 小于
<= 小于等于


模式匹配
~ 左边是否和右边匹配,可以相等,左边包含右边的字符串。在相等或者左边包含右边的情况下,判断结果为真
!~ 不匹配


我们通过例子看看:
# 实例1:
[root@studyclub script]# awk -F: '$0 ~ /root/{print $1}' /etc/passwd
root
operator


上面这个命令的意思解读:
$0 一行(准确的说是一个记录,但我们使用的是默认的记录分隔符,所以一个记录就是一行)
/root/root两端的斜线“/”是模式匹配的固定格式,和前面sed里用到的模式匹配是一样的。
所以命令的意思是正在处理的当前行是否包含root字符串,如果包含,那么就按照冒号“:”作为分隔符,把第一列打印出来。如果不包含,就不打印。
# 实例2:
# 现在我们把之前查看有哪些客户端连接到了本机的例子重新写一个更简单的(省略掉grep):
[root@studyclub script]# ss -nt | awk -F "[[:space:]]+|:" '$0 ~ /^ESTAB/{print $(NF-2)}'
10.0.0.1

# 实例3:
# 通过awk查看uid为0的账户信息
[root@studyclub script]# awk -F: '$3==0' /etc/passwd
root:x:0:0:root:/root:/bin/bash

# 实例4:我们之前在讲grep和sed的时候都提到了取IP地址的操作,awk也可以:
[root@studyclub script]# ifconfig ens33 | awk 'NR==2{print $2}' # 记住哦,awk默认是以空格作为分隔符
10.0.0.136
# 如果上面的不好理解,我们也可以指定分隔符
[root@studyclub script]# ifconfig ens33 | awk -F"[[:space:]]+" 'NR==2{print $3}' # 行首有多个连续的空格,所以ip地址就变成了第三列了
10.0.0.136


逻辑运算

&& 与
||    或
! 非


实例演示:
# 实例1:查看UID小于1000的用户名称(即查看系统账户的用户名称)
[root@studyclub jason]# awk -F: '$3>=0 && $3<1000 {print $1}' /etc/passwd
root
......
rpc
rpcuser
chrony

# 实例2:查看管理员和普通用户有哪些
[root@studyclub jason]# awk -F: '$3==0 || $3>
=1000 {print $1}' /etc/passwd
root
jason
james
eric
simon
......

# 实例3:练习一下取反。注意:对于取反的判断条件要用小括号括起来
[root@studyclub jason]# awk -F: '!($3<1000) {print $1}' /etc/passwd
jason
james
eric
simon
......


条件表达式(三目表达式):

selector?if-true-expression;if-false-expression

实例演示:

[root@studyclub jason]# awk 'BEGIN{a="jason";print a=="james"?"yes":"no"}'
no
[root@studyclub jason]# awk 'BEGIN{a="b";print a=="b"?"yes":"no"}'
yes

# 把用户按照UID大小分类标记
[root@studyclub jason]# awk -F: '$3>=1000?type="common_user":type="sysuser"{printf "%16s %s\n",$1,type}' /etc/passwd
            root sysuser
          ......
         postfix sysuser
           jason common_user

手应知:

    尝鲜Rocky Linux

《Linux基础及进阶》:

    062 - 正则表达式(3)-扩展正则表达式
    063 - 正则表达式(4)-三剑客之grep
    064 - 正则表达式(5)-三剑客之sed
   065 - 正则表达式(6)-三剑客之awk(1)
    066 - 正则表达式(7)-三剑客之awk(2)


看完本文有收获?请分享给更多人


推荐关注「Cloud研习社」,带你从零开始掌握云计算技术!

微信号|bjdream-1


Cloud研习社 · 

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存