6 个强大的 Awk 运算符示例

举报
Tiamo_T 发表于 2022/01/28 15:48:28 2022/01/28
【摘要】 与任何其他编程语言一样,Awk 也有许多用于数字和字符串操作的运算符。在本文中,让我们讨论所有关键的awk 运算符。

与任何其他编程语言一样,Awk 也有许多用于数字和字符串操作的运算符。在本文中,让我们讨论所有关键的awk 运算符

awk 中有两种类型的运算符。

  1. 一元运算符——接受单个操作数的运算符称为一元运算符。
  2. 二元运算符——接受多个操作数的运算符称为二元运算符。

awk 一元运算符

操作 描述
+ 正数
否定数字
++ 自动递增
自动递减

awk 二元运算符

在 Awk 中有不同种类的二元运算符可用。它是根据其用途分类的。

awk 算术运算符

以下运算符用于执行算术计算。

操作 描述
+ 添加
减法
* 乘法
/ 分配
% 模除法

awk 字符串运算符

对于字符串连接,Awk 具有以下运算符。

操作 描述
(space) 字符串连接

awk 赋值运算符

awk 具有赋值运算符和快捷赋值运算符,如下所示。

操作 描述
= 任务
+= 快捷键添加赋值
-= 快捷减法赋值
*= 快捷乘法赋值
/= 快捷键分配
%= 快捷键模除法赋值

awk 条件运算符

awk 有以下条件运算符列表,可用于控制结构和循环语句,将在下一篇文章中介绍。


操作 描述
> 大于
>= 大于或等于
< 小于
<= 小于或等于
<= 小于或等于
== 等于
!= 不等于
&& 两个条件表达式都应该为真
|| 任何一个条件表达式都应该为真

awk 正则表达式运算符

操作 描述
~ 匹配运算符
!~ 无匹配运算符

awk 运算符示例

现在让我们回顾一些使用 awk 运算符的示例。让我们在这些示例中使用 /etc/passwd 作为输入文件。

$ cat /etc/passwd
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
syslog:x:101:102::/home/syslog:/bin/false
hplip:x:103:7:HPLIP system user,,,:/var/run/hplip:/bin/false
saned:x:110:116::/home/saned:/bin/false
pulse:x:111:117:PulseAudio daemon,,,:/var/run/pulse:/bin/false
gdm:x:112:119:Gnome Display Manager:/var/lib/gdm:/bin/false

awk 示例 1:计算文件中的字段总数。

下面的 awk 脚本匹配所有行并使用快捷添加赋值运算符不断添加每行中的字段数。到目前为止看到的字段数保存在一个名为“total”的变量中。处理完输入后,将执行特殊模式“END {…}”,打印字段总数。

$ awk -F ':' '{ total += NF }; END { print total }' /etc/passwd
49

awk 示例 2:计算使用 /bin/sh shell 的用户数

在下面的 awk 脚本中,它匹配包含模式 /bin/sh 的所有行的最后一个字段。正则表达式应该在 //. 所以所有的前斜杠(/)都必须在正则表达式中转义。当一行匹配变量 'n' 时,变量 'n' 会加一。在 END 部分打印 'n' 的值。

$ awk -F ':' '$NF ~ /\/bin\/sh/ { n++ }; END { print n }' /etc/passwd
2

awk 示例 3:查找具有最高 USER ID 的用户详细信息

下面的 awk 脚本跟踪变量“maxuid”中字段中的最大数字,相应的行将存储在变量“maxline”中。一旦它遍历了所有行,它就会将它们打印出来。

$ awk -F ':'  '$3 > maxuid { maxuid=$3; maxline=$0 }; END { print maxuid, maxline }' /etc/passwd
112 gdm:x:112:119:Gnome Display Manager:/var/lib/gdm:/bin/false

awk 示例 4:打印偶数行

下面的 awk 脚本处理每一行并检查 NR % 2 ==0 即 NR 是否是 2 的倍数。它执行打印整行的默认操作。

$ awk 'NR % 2 == 0' /etc/passwd
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
hplip:x:103:7:HPLIP system user,,,:/var/run/hplip:/bin/false
pulse:x:111:117:PulseAudio daemon,,,:/var/run/pulse:/bin/false

awk 示例 5.打印具有相同 USER ID 和 GROUP ID 的每一行

仅当 $3(USER ID) 和 $4(GROUP ID) 相等时,下面的 awk 脚本才会打印该行。它为每一行输入检查此条件,如果匹配,则打印整行。

$awk -F ':' '$3==$4' passwd.txt
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh

awk 示例 6:打印 USER ID 大于或等于 100 且必须使用 /bin/sh 的用户详细信息

在下面的 awk 语句中,有两个条件表达式,一个是 User id($3) 大于或等于 100,第二个是最后一个字段应该与 /bin/sh 匹配,'&&' 是仅当以上两者都打印时条件为真。

$ awk -F ':' '$3>=100 && $NF ~ /\/bin\/sh/' passwd.txt
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。