awk语法-02-运算、数组、格式化输出

1. 比较运算

1.1 说明

符号说明
>大于
<小于
>=大于等于
<=小于等于
==等于
!=不等于
~匹配
!~非匹配

1.2 示例

查看普通用户

即id号大于等于1000的用户

[root@liubei ~]# awk -F: '$3>=1000{print $1,$3}' /etc/passwd
cloud_user 1000
liubei 1001
guanyu 1002

查看非root用户

id非0的用户

[root@liubei ~]# awk -F : '$1!="root"{print $1,$3}' /etc/passwd
bin 1
daemon 2
adm 3
lp 4
……
liubei 1001
guanyu 1002
guanping 1003

匹配

[root@liubei ~]# awk -F : '$1~"uan"{print $1,$3}' /etc/passwd
guanyu 1002
guanping 1003

匹配支持正则

  • 包含 guan.*g的用户
[root@liubei ~]# awk -F : '$1~"guan.*g"{print $1,$3}' /etc/passwd
guanping 1003
  • l开头的用户
[root@liubei ~]# awk -F : '$1~"\\<l.*"{print $1,$3}' /etc/passwd
lp 4
liubei 1001

2. 算术运算

2.1 说明

符号说明
+
-
*
/
%取余
^

2.2 示例(打印奇数id的用户)

[root@liubei ~]# awk -F: '$3%2==1{print $1,$3}' /etc/passwd
bin 1
adm 3
sync 5
halt 7
operator 11
nobody 99
dbus 81
polkitd 999
postfix 89
liubei 1001
guanping 1003

3. 逻辑运算

3.1 说明

符号说明
&&
||

3.2 示例(打印非系统用户)

即 root(id=0)和普通用户(id>=1000)

[root@liubei ~]# awk -F: '$3==0||$3>=1000{print $1,$3}' /etc/passwd
root 0
cloud_user 1000
liubei 1001
guanyu 1002
guanping 1003

4. 数组

4.1 创建数组

语法

数组名[索引]=值

示例

  • 创建 test.awk内容如下
#!/bin/awk -f
BEGIN{
user[0]="liubei";
user[1]="guanyu";
print user[0],user[1]
}
  • 执行
[root@liubei ~]# ./test.awk
liubei guanyu

4.2 删除数组

语法

delete 数组名[索引]

示例

  • 创建test.awk文件如下
#!/bin/awk -f
BEGIN{
user[0]="liubei";
user[1]="guanyu";
delete user[1];
print user[0],user[1]
}
  • 执行
[root@liubei ~]# ./test.awk
liubei

5. printf 格式化输出

和其他语言没有什么区别,简单示例一下:

接收类型

awk -F: '{printf "%s %s \n", $1,$3}' /etc/passwd

说明: %s 字符型,%d 整数型,%f 浮点型

定义列宽

在接收类型中间可以添加数字表示列宽。

  • 语法示例
awk -F: '{printf "|%20s|%20s\n", $1,$3}' /etc/passwd
  • 执行结果
| root| 0
| bin| 1
| daemon| 2
| adm| 3
| lp| 4
……

对齐方式

在列宽两侧加-,表示字串靠哪个方向对齐(默认右对齐)。

  • 语法示例
awk -F: '{printf "|%-20s|%-20s\n", $1,$3}' /etc/passwd
  • 执行结果
|root |0
|bin |1
|daemon |2
|adm |3
|lp |4
……

完整示例

  • 创建myAwk.awk 文件如下
#!/bin/awk -f
BEGIN{
FS=":";
line="============================================";
printf "|%-20s|%-20s|%-20s\n%s\n","Type","Name","Id",line
}
{
if($3==0){
printf "|%-20s|%-20s|%-20s\n","root_user",$1,$3
}else if($3>=1000){
printf "|%-20s|%-20s|%-20s\n", "ord_user",$1,$3
}else{
printf "|%-20s|%-20s|%-20s\n", "sys_user",$1,$3
}
}
  • 执行
[root@liubei ~]# ./myAwk.awk /etc/passwd
|Type |Name |Id
============================================
|root_user |root |0
|sys_user |bin |1
|sys_user |daemon |2
|sys_user |adm |3
|sys_user |lp |4
|sys_user |sync |5
|sys_user |shutdown |6
|sys_user |halt |7
|sys_user |mail |8
|sys_user |operator |11
|sys_user |games |12
|sys_user |ftp |14
|sys_user |nobody |99
|sys_user |systemd-network |192
|sys_user |dbus |81
|sys_user |polkitd |999
|sys_user |sshd |74
|sys_user |postfix |89
|sys_user |chrony |998
|ord_user |cloud_user |1000
|ord_user |liubei |1001
|ord_user |guanyu |1002
|ord_user |guanping |1003

在这里插入图片描述

posted on   运维开发玄德公  阅读(11)  评论(0编辑  收藏  举报  

相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示