awk语法-02-运算、数组、格式化输出
2022-08-02 本文已影响0人
玄德公笔记
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