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
[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:将字符串转换为数值
字符串操作符:没有符号的操作符,字符串连接
赋值操作符:
=, +=, -=, *=, /=, %=, ^=,++, --
[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
比较操作符:
==, !=, >, >=, <, <=
[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
逻辑操作符:
与:&&,并且关系
或:||,或者关系
非:!,取反
[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
!后面加不加都可以
PATTERN:根据pattern条件,过滤匹配的行,再做处理
1. 如果未指定:空模式,匹配每一行
[root@centos8 ~]#awk -F: '{print $1,$3}' /etc/passwd
- /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-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{}:仅在文本处理完成之后执行一次
[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