1.动作 printf

printf 可以实现格式化输出
格式:
printf “FORMAT”, item1, item2, ...

说明:

   必须指定FORMAT

  不会自动换行,需要显式给出换行控制符 \n

  FORMAT中需要分别为后面每个item指定格式符

格式符:与item一一对应

  %c:显示字符的ASCII码

  %d, %i:显示十进制整数

  %e, %E:显示科学计数法数值

  %f:显示为浮点数

  %g, %G:以科学计数法或浮点形式显示数值

  %s:显示字符串

  %u:无符号整数

  %%:显示%自身

修饰符

#[.#] 第一个数字控制显示的宽度;第二个#表示小数点后精度,如:%3.1f

左对齐(默认右对齐) 如:%-15s

+显示数值的正负符号  如:%+d

#yyds干货盘点#awk的算术和逻辑处理_格式化输出

#yyds干货盘点#awk的算术和逻辑处理_格式化输出_02

#yyds干货盘点#awk的算术和逻辑处理_格式化输出_03

#yyds干货盘点#awk的算术和逻辑处理_格式化输出_04

#yyds干货盘点#awk的算术和逻辑处理_格式化输出_05

#yyds干货盘点#awk的算术和逻辑处理_左对齐_06

#yyds干货盘点#awk的算术和逻辑处理_格式化输出_07

#yyds干货盘点#awk的算术和逻辑处理_科学计数法_08

#yyds干货盘点#awk的算术和逻辑处理_左对齐_09


#yyds干货盘点#awk的算术和逻辑处理_科学计数法_10

#yyds干货盘点#awk的算术和逻辑处理_格式化输出_11

[root@c7-147 ~]#awk -F: '{printf "%s",$1}' /etc/passwd
[root@c7-147 ~]#awk -F: '{printf "%s\n",$1}' /etc/passwd
[root@c7-147 ~]#awk -F: '{printf "%20s\n",$1}' /etc/passwd
[root@c7-147 ~]#awk -F: '{printf "%-20s\n",$1}' /etc/passwd
awk -F: '{printf "%-20s %10d\n",$1,$3}' /etc/passwd
awk -F: '{printf "Username: %s\n",$1}' /etc/passwd
awk -F: '{printf "Username: %sUID:%d\n",$1,$3}' /etc/passwd
awk -F: '{printf "Username: %25sUID:%d\n",$1,$3}' /etc/passwd
awk -F: '{printf "Username: %-25sUID:%d\n",$1,$3}' /etc/passwd

 2.操作符

算术操作符:

x+y, x-y, x*y, x/y, x^y, x%y
-x:转换为负数
+x:将字符串转换为数值

字符串操作符:没有符号的操作符,字符串连接

赋值操作符:

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

#yyds干货盘点#awk的算术和逻辑处理_左对齐_12

[root@c7-147 ~]#awk 'BEGIN{i=0;print i++,i}' 
0 1
[root@c7-147 ~]#awk 'BEGIN{i=0;print ++i,i}'
1 1

打印第一行,n=0 !n=1 可以打印,变为2的时候取反为0,不再打印
[root@centos8 ~]#awk -v n=0 '!n++' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@centos8 ~]#awk -v n=0 '!n++{print n}' /etc/passwd
1
[root@c7-147 ~]#awk -v n=1 '!n++{print n}' /etc/passwd
[root@c7-147 ~]#
[root@c7-147 ~]#awk -v n=-1 '!n++{print n}' /etc/passwd
1
[root@centos8 ~]#awk -v n=1 '!n++{print n}' /etc/passwd
++n是先加完了再取反
[root@centos8 ~]#awk -v n=0 '!++n{print n}' /etc/passwd
[root@centos8 ~]#awk -v n=0 '!++n' /etc/passwd
[root@centos8 ~]#awk -v n=-1 '!++n' /etc/passwd
root:x:0:0:root:/root:/bin/bash

#yyds干货盘点#awk的算术和逻辑处理_科学计数法_13

比较操作符:
==, !=, >, >=, <, <=

[root@centos8 ~]#awk 'NR==2' /etc/issue
Kernel \r on an \m
[root@c7-147 ~]#awk -F: '$3>=1000' /etc/passwd
wang:x:1000:1000::/home/wang:/bin/bash
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

取奇,偶数行

[root@centos8 ~]#seq 10 | awk 'NR%2==0'
2
4
6
8
10
[root@centos8 ~]#seq 10 | awk 'NR%2==1'
1
3
5
7
9
[root@centos8 ~]#seq 10 | awk 'NR%2!=0'
1
3
5
7
9

3.模式匹配符:

左边是否和右边匹配,包含系 

 !~ 是否不匹配

[root@centos8 ~]#awk -F: '$0 ~ /root/{print $1}' /etc/passwd 
root
operator
dockerroot
[root@centos8 ~]#awk -F: '$0 ~ "^root"{print $1}' /etc/passwd
root
[root@c7-147 ~]#awk '$0 !~ /root/' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
[root@centos8 ~]#awk '/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
dockerroot:x:995:992:Docker User:/var/lib/docker:/sbin/nologin
[root@c7-147 ~]#awk -F: '$3==0' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@centos8 ~]#df | awk -F"[[:space:]]+|%" '$0 ~ /^\/dev\/sd/{print $5}'
5
1
92
[root@centos8 ~]#ifconfig eth0 | awk 'NR==2{print $2}'
10.0.0.8

逻辑操作符:

与:&&,并且关系

或:||,或者关系

非:!,取反

#yyds干货盘点#awk的算术和逻辑处理_格式化输出_14

[root@c7-147 ~]#awk -F: '$3>=0 && $3<=1000 {print $1,$3}' /etc/passwd
[root@c7-147 ~]#awk -F: '$3==0 || $3>=1000 {print $1,$3}' /etc/passwd
[root@c7-147 ~]#awk -F: '!($3==0) {print $1,$3}' /etc/passwd
[root@c7-147 ~]#awk -F: '!($3>=500) {print $1,$3}' /etc/passwd

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

selector?if-true-expression:if-false-expression
条件成立就是冒号前面的。否则就是冒号后面的
[root@c7-147 ~]#awk -F: '{$3>=1000?usertype="Common User":usertype="SysUser";printf "%-20s:%12s\n",$1,usertype}' /etc/passwd
root : SysUser
bin : SysUser
daemon : SysUser
adm : SysUser
lp : SysUser
sync : SysUser
shutdown : SysUser
halt : SysUser
mail : SysUser
operator : SysUser
games : SysUser
ftp : SysUser
nobody : SysUser
avahi-autoipd : SysUser
systemd-bus-proxy : SysUser
systemd-network : SysUser
dbus : SysUser
polkitd : SysUser
tss : SysUser
postfix : SysUser
sshd : SysUser
mysql : SysUser
dhcpd : SysUser
dockerroot : SysUser
wang : Common User
rpc : SysUser
rpcuser : SysUser
nfsnobody : Common User
tcpdump : SysUser
ntp : SysUser
nginx : SysUser
pcp : SysUser
[root@c7-147 ~]#

4. 模式PATTERN

#yyds干货盘点#awk的算术和逻辑处理_科学计数法_15

#yyds干货盘点#awk的算术和逻辑处理_科学计数法_16

#yyds干货盘点#awk的算术和逻辑处理_格式化输出_17

!后面加不加都可以

#yyds干货盘点#awk的算术和逻辑处理_格式化输出_18


PATTERN:根据pattern条件,过滤匹配的行,再做处理

1. 如果未指定:空模式,匹配每一行

[root@centos8 ~]#awk -F: '{print $1,$3}' /etc/passwd
  1. /regular expression/:仅处理能够模式匹配到的行,需要用/ /括起
[root@c7-147 ~]#awk '/^UUID/{print $1}' /etc/fstab
UUID=1ebf2de9-d896-401d-9d33-1e74eee806da
UUID=af5925a2-c99f-4f03-892b-edafd53060ee
[root@c7-147 ~]#awk '!/^UUID/{print $1}' /etc/fstab
#
#
#
#
#
#
#
#/dev/mapper/centos-root
/dev/mapper/centos-swap
[root@c7-147 ~]#df| awk '/^\/dev\/sd/'
/dev/sda1 508588 127464 381124 26% /boot

relational expression: 关系表达式,结果为“真”才会被处理

真:结果为非0值,非空字符串

假:结果为空字符串或0值

[root@centos8 ~]#awk  '!1'  /etc/passwd
[root@centos8 ~]#awk '!0' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
.......
[root@centos8 ~]#awk '1' /etc/issue
\S
Kernel \r on an \m
[root@centos8 ~]#awk '0' /etc/issue
[root@centos8 ~]#awk '"magedu"' /etc/issue
\S
Kernel \r on an \m
[root@centos8 ~]#awk '""' /etc/issue
[root@centos8 ~]#awk 'magedu' /etc/issue 没有加双引号被认为是空
[root@centos8 ~]#awk 'magedu' /etc/issue
[root@centos8 ~]#awk -v magedu=wang 'magedu' /etc/issue
\S
Kernel \r on an \m
[root@centos8 ~]#awk -v magedu="" 'magedu' /etc/issue
[root@centos8 ~]#awk -v magedu="0" 'magedu' /etc/issue
[root@centos8 ~]#awk -v magedu=0 'magedu' /etc/issue
[root@centos8 ~]#awk '"0"' /etc/issue 0被当做字符串了,所以可以打印
\S
Kernel \r on an \m
[root@centos8 ~]#awk '0' /etc/issue


awk -F: 'i=1;j=1{print i,j}' /etc/passwd
[root@c7-147 ~]#awk -F: 'i=1;j=1{print i,j}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
1 1
bin:x:1:1:bin:/bin:/sbin/nologin
1 1
daemon:x:2:2:daemon:/sbin:/sbin/nologin
1 1
adm:x:3:4:adm:/var/adm:/sbin/nologin
1 1
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
1 1
sync:x:5:0:sync:/sbin:/bin/sync
1 1
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
1 1
halt:x:7:0:halt:/sbin:/sbin/halt
1 1
...
awk -F: '$3>=1000{print $1,$3}' /etc/passwd
awk -F: '$3<1000{print $1,$3}' /etc/passwd
awk -F: '$NF=="/bin/bash"{print $1,$NF}' /etc/passwd
[root@centos8 ~]#awk -F: '$NF=="/bin/bash"{print $1,$NF}' /etc/passwd
root /bin/bash
wang /bin/bash
mage /bin/bash
[root@centos8 ~]#awk -F: '$NF ~ /bash$/{print $1,$NF}' /etc/passwd
root /bin/bash
wang /bin/bash
mage /bin/bash

5.line ranges:行范围

不支持直接用行号,但可以使用变量NR间接指定行号

/pat1/,/pat2/ 不支持直接给出数字格式

[root@centos8 ~]#seq 10 | awk 'NR>=3 && NR<=6'
3
4
5
6
[root@centos8 ~]#awk 'NR>=3 && NR<=6{print NR,$0}' /etc/passwd
3daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
[root@centos8 ~]#sed -n '3,6p' /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
[root@centos8 ~]#awk '/^bin/,/^adm/' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@centos8 ~]#sed -n '/^bin/,/^adm/p' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

6.BEGIN/END模式

BEGIN{}:仅在开始处理文件中的文本之前执行一次

END{}:仅在文本处理完成之后执行一次

#yyds干货盘点#awk的算术和逻辑处理_格式化输出_19

[root@c7-147 ~]#awk -F : 'BEGIN {print "USER USERID"} {print $1":"$3} END{print "END FILE"}' /etc/passwd
USER USERID
root:0
bin:1
daemon:2
adm:3
lp:4
sync:5
shutdown:6
halt:7
mail:8
operator:11
games:12
ftp:14

[root@c7-147 ~]#awk -F: '{print "USER USERID";print $1":"$3} END{print "END FILE"}' /etc/passwd
USER USERID
root:0
USER USERID
bin:1
USER USERID
daemon:2
USER USERID
adm:3
USER USERID
lp:4
USER USERID
sync:5

[root@c7-147 ~]#awk -F: 'BEGIN{print "USERUID\n--------------- "}{print $1,$3}' /etc/passwd
USERUID
---------------
root 0
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
mail 8
operator 11
games 12
ftp 14
nobody 99
avahi-autoipd 170

[root@c7-147 ~]#awk -F: 'BEGIN{print "USER UID \n--------"}{print $1,$3}END{print "=========="}' /etc/passwd
USER UID
--------
root 0
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
mail 8
operator 11


[root@c7-147 ~]#seq 10 | awk 'i=0'
[root@c7-147 ~]#seq 10 | awk 'i=01'
1
2
3
4
5
6
7
8
9
10
[root@c7-147 ~]#seq 10| awk 'i=!i'
1
3
5
7
9

取奇偶数
[root@c7-147 ~]#seq 10| awk '!(i=!i)'
2
4
6
8
10
[root@c7-147 ~]#seq 10| awk -v i=1 'i=!i'
2
4
6
8
10
[root@c7-147 ~]#seq 10| awk -v i=0 'i=!i'
1
3
5
7
9



[root@c7-147 ~]#seq 10| awk '{i=!i;print i}'
1
0
1
0
1
0
1
0
1
0

#yyds干货盘点#awk的算术和逻辑处理_左对齐_20

#yyds干货盘点#awk的算术和逻辑处理_格式化输出_21