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

匹配支持正则

[root@liubei ~]# awk -F : '$1~"guan.*g"{print $1,$3}' /etc/passwd
guanping 1003
[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 创建数组

语法

数组名[索引]=值

示例

#!/bin/awk -f
BEGIN{
  user[0]="liubei";
  user[1]="guanyu";
  print user[0],user[1]
}
[root@liubei ~]# ./test.awk
liubei guanyu

4.2 删除数组

语法

delete 数组名[索引]

示例

#!/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
……

完整示例

#!/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

上一篇下一篇

猜你喜欢

热点阅读