F.E.
1> 简单应用:取出指定文本内容的字段;
[root@KOU ~]#
[root@KOU ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Mon May 21 20:19:01 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=cf39f560-952f-4328-9110-c0dc20265fae / xfs defaults 0 0
UUID=a9c73f6f-3e2f-40d8-8c20-d2421bb15e88 /boot xfs defaults 0 0
/dev/mapper/KOU-usr /usr xfs defaults 0 0
UUID=e68723d4-44ce-4fde-a3e9-816e5d6d4f0c /var xfs defaults 0 0
UUID=db46ba65-2bb9-49f8-8c89-c1ac8cb4c9be swap swap defaults 0 0
[root@KOU ~]#
[root@KOU ~]# tail -5 /etc/fstab | gawk '{print $2,$4,$6}'
/ defaults 0
/boot defaults 0
/usr defaults 0
/var defaults 0
swap defaults 0
[root@KOU ~]#
2> print输出:可以是片段的位置变量、手动指定的字符串、数值等;
[root@KOU ~]#
[root@KOU ~]# tail -5 /etc/fstab | gawk '{print "hello,U",$2,$4,$6}'
hello,U / defaults 0
hello,U /boot defaults 0
hello,U /usr defaults 0
hello,U /var defaults 0
hello,U swap defaults 0
[root@KOU ~]#
[root@KOU ~]# tail -5 /etc/fstab | gawk '{print "hello,U",$2,$4,9,$6}'
hello,U / defaults 9 0
hello,U /boot defaults 9 0
hello,U /usr defaults 9 0
hello,U /var defaults 9 0
hello,U swap defaults 9 0
[root@KOU ~]#
[root@KOU ~]# tail -5 /etc/fstab | gawk '{print "hello,U:$2",$4,9,$6}'
hello,U:$2 defaults 9 0
hello,U:$2 defaults 9 0
hello,U:$2 defaults 9 0
hello,U:$2 defaults 9 0
hello,U:$2 defaults 9 0
[root@KOU ~]#
3> 打印输出时,省略”item”,则相当于print $0;
[root@KOU ~]#
[root@KOU ~]# tail -5 /etc/fstab | gawk '{print}'
UUID=cf39f560-952f-4328-9110-c0dc20265fae / xfs defaults 0 0
UUID=a9c73f6f-3e2f-40d8-8c20-d2421bb15e88 /boot xfs defaults 0 0
/dev/mapper/KOU-usr /usr xfs defaults 0 0
UUID=e68723d4-44ce-4fde-a3e9-816e5d6d4f0c /var xfs defaults 0 0
UUID=db46ba65-2bb9-49f8-8c89-c1ac8cb4c9be swap swap defaults 0 0
[root@KOU ~]#
4> 打印输出时,print 后面跟2个双引号,表示不打印文本内容,而是打印空白行;文本有多少行,空白行就有多少;
[root@KOU ~]#
[root@KOU ~]# tail -5 /etc/fstab | gawk '{print ""}'
[root@KOU ~]#
5> 打印输出,利用内置变量,指定分隔符(根据原文本的分隔符);
[root@KOU ~]#
[root@KOU ~]# gawk -v FS=':' '{print $1}' /etc/passwd | head -7
root
bin
daemon
adm
lp
sync
shutdown
[root@KOU ~]#
[root@KOU ~]#
[root@KOU ~]# gawk -F: '{print $1}' /etc/passwd | head -7
root
bin
daemon
adm
lp
sync
shutdown
[root@KOU ~]#
6> 打印输出,指定输出显示时的分隔符(默认是空白字符);
[root@KOU ~]#
[root@KOU ~]# gawk -F: '{print $1,$3,$6,$7}' /etc/passwd | head -7
root 0 /root /bin/bash
bin 1 /bin /sbin/nologin
daemon 2 /sbin /sbin/nologin
adm 3 /var/adm /sbin/nologin
lp 4 /var/spool/lpd /sbin/nologin
sync 5 /sbin /bin/sync
shutdown 6 /sbin /sbin/shutdown
[root@KOU ~]#
[root@KOU ~]# gawk -F: -v OFS=':' '{print $1,$3,$6,$7}' /etc/passwd | head -7
root:0:/root:/bin/bash
bin:1:/bin:/sbin/nologin
daemon:2:/sbin:/sbin/nologin
adm:3:/var/adm:/sbin/nologin
lp:4:/var/spool/lpd:/sbin/nologin
sync:5:/sbin:/bin/sync
shutdown:6:/sbin:/sbin/shutdown
[root@KOU ~]#
[root@KOU ~]# gawk -v FS=':' -v OFS=':' '{print $1,$3,$6,$7}' /etc/passwd | head -7
root:0:/root:/bin/bash
bin:1:/bin:/sbin/nologin
daemon:2:/sbin:/sbin/nologin
adm:3:/var/adm:/sbin/nologin
lp:4:/var/spool/lpd:/sbin/nologin
sync:5:/sbin:/bin/sync
shutdown:6:/sbin:/sbin/shutdown
[root@KOU ~]#
7> 打印输出,指定换行符;
[root@KOU ~]#
[root@KOU ~]# gawk -v RS=' ' '{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
......
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP
User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd
Network
Management:/:/sbin/nologin
dbus:x:81:81:System
message
bus:/:/sbin/nologin
polkitd:x:999:997:User
for
polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
......
tss:x:59:59:Account
used
by
the
trousers
package
to
sandbox
the
tcsd
daemon:/dev/null:/sbin/nologin
......
[root@KOU ~]#
[root@KOU ~]# gawk -v RS=' ' -v ORS='@' '{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
......
ftp:x:14:50:FTP@User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd@Network@Management:/:/sbin/nologin
dbus:x:81:81:System@message@bus:/:/sbin/nologin
......
sshd:x:74:74:Privilege-separated@SSH:/var/empty/sshd:/sbin/nologin
kou:x:1000:1000:kou:/home/kou:/bin/bash
tss:x:59:59:Account@used@by@the@trousers@package@to@sandbox@the@tcsd@daemon:/dev/null:/sbin/nologin
geoclue:x:998:996:User@for@geoclue:/var/lib/geoclue:/sbin/nologin
rpc:x:32:32:Rpcbind@Daemon:/var/lib/rpcbind:/sbin/nologin
libstoragemgmt:x:997:993:daemon@account@for@libstoragemgmt:/var/run/lsm:/sbin/nologin
gluster:x:996:992:GlusterFS@daemons:/var/run/gluster:/sbin/nologin
......
[root@KOU ~]#
[root@KOU ~]# gawk -v RS=':' '{print}' /etc/passwd
root
x
0
0
root
/root
/bin/bash
bin
x
1
1
bin
/bin
/sbin/nologin
daemon
x
2
2
[root@KOU ~]#
[root@KOU ~]# gawk -v RS=':' -v ORS='#' '{print}' /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
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
8> 示例8,打印输出每行的字段数量;打印每行的最后一个字段的具体内容;
[root@KOU ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Mon May 21 20:19:01 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=cf39f560-952f-4328-9110-c0dc20265fae / xfs defaults 0 0
UUID=a9c73f6f-3e2f-40d8-8c20-d2421bb15e88 /boot xfs defaults 0 0
/dev/mapper/KOU-usr /usr xfs defaults 0 0
UUID=e68723d4-44ce-4fde-a3e9-816e5d6d4f0c /var xfs defaults 0 0
UUID=db46ba65-2bb9-49f8-8c89-c1ac8cb4c9be swap swap defaults 0 0
[root@KOU ~]#
[root@KOU ~]# gawk '{print NF}' /etc/fstab
0
1
2
10
1
9
12
1
6
6
6
6
6
[root@KOU ~]#
[root@KOU ~]# gawk '{print $NF}' /etc/fstab
#
/etc/fstab
2018
#
'/dev/disk'
info
#
0
0
0
0
0
[root@KOU ~]#
9> 打印输出,显示文本行编号;
[root@KOU ~]# gawk '{print NR}' /etc/fstab
1
2
3
4
5
6
7
8
9
10
11
12
13
[root@KOU ~]#
[root@KOU ~]# gawk '{print NR}' /etc/fstab /etc/issue
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@KOU ~]#
[root@KOU ~]# gawk '{print FNR}' /etc/fstab /etc/issue
1
2
3
4
5
6
7
8
9
10
11
12
13
1
2
3
[root@KOU ~]#
10> 显示文件名:文件内容有多少行就显示多少行的文件名;
[root@KOU ~]# gawk '{print FILENAME}' /etc/fstab
/etc/fstab
/etc/fstab
/etc/fstab
/etc/fstab
/etc/fstab
/etc/fstab
/etc/fstab
/etc/fstab
/etc/fstab
/etc/fstab
/etc/fstab
/etc/fstab
/etc/fstab
[root@KOU ~]#
11> 显示命令行参数个数;显示命令行所给定的各个参数;
[root@KOU ~]#
[root@KOU ~]# gawk 'BEGIN {print ARGC}' /etc/fstab /etc/fstab
3
[root@KOU ~]#
[root@KOU ~]# gawk 'BEGIN{print ARGV[0]}' /etc/fstab /etc/fstab
gawk
[root@KOU ~]# gawk 'BEGIN{print ARGV[1]}' /etc/fstab /etc/fstab
/etc/fstab
[root@KOU ~]# gawk 'BEGIN{print ARGV[2]}' /etc/fstab /etc/fstab
/etc/fstab
[root@KOU ~]#
12> 自定义变量:分别在’-v’及’program’中定义;
[root@KOU ~]#
[root@KOU ~]# gawk -v test="hello world." '{print test}' /etc/issue
hello world.
hello world.
hello world.
[root@KOU ~]#
[root@KOU ~]# gawk -v test="hello world." 'BEGIN{print test}' /etc/issue
hello world.
[root@KOU ~]#
[root@KOU ~]# gawk 'BEGIN{test="hello world.";print test}' /etc/issue
hello world.
[root@KOU ~]#
13> printf命令,打印显示/etc/passwd文件的指定字段(带格式符):
未带换行符以字符串形式显示;
-----------------------------
[root@KOU ~]#
[root@KOU ~]# awk -F: '{printf "%s",$1}' /etc/passwd | head -7
rootbindaemonadmlpsyncshutdownhaltmailoperatorgamesftpnobodysystemd-networkdbuspolkitdpostfixsshdkoutssgeocluerpclibstoragemgmtglusterrtkitntpabrtcolordsetroubleshootpulsegdmmysqlchronyrpcusernfsnobodysssdtcpdumpmahaqemuusbmuxdsaslauthradvdunboundavahignome-initial-setupa1a2a3a4a5a6a7a8a9a10910dd1dd2dd3dd4dd5dd6dd7dd8dd9dd10e1e2e3e4e5e6e7e8e9e10apache[root@KOU ~]#
[root@KOU ~]#
带换行符以字符串方式显示;
------------------------------
[root@KOU ~]# awk -F: '{printf "%s\n",$1}' /etc/passwd | head -7
root
bin
daemon
adm
lp
sync
shutdown
[root@KOU ~]#
带换行符以字符串方式显示,同时增加其他自定义字符串;
---------------------------------------------------------
[root@KOU ~]# awk -F: '{printf "username: %s\n",$1}' /etc/passwd | head -7
username: root
username: bin
username: daemon
username: adm
username: lp
username: sync
username: shutdown
[root@KOU ~]#
带换行符,指定多个格式符;
---------------------------------
[root@KOU ~]# awk -F: '{printf "username: %s , uid: %d\n",$1,$3}' /etc/passwd | head -7
username: root , uid: 0
username: bin , uid: 1
username: daemon , uid: 2
username: adm , uid: 3
username: lp , uid: 4
username: sync , uid: 5
username: shutdown , uid: 6
[root@KOU ~]#
14> printf命令,打印显示/etc/passwd文件的指定字段(带修饰符、格式符):
[root@KOU ~]#
[root@KOU ~]# awk -F: '{printf "username: %11s uid: %d\n",$1,$3}' /etc/passwd | head -12
username: root uid: 0
username: bin uid: 1
username: daemon uid: 2
username: adm uid: 3
username: lp uid: 4
username: sync uid: 5
username: shutdown uid: 6
username: halt uid: 7
username: mail uid: 8
username: operator uid: 11
username: games uid: 12
username: ftp uid: 14
[root@KOU ~]#
[root@KOU ~]# awk -F: '{printf "username: %-11s uid: %d\n",$1,$3}' /etc/passwd | head -12
username: root uid: 0
username: bin uid: 1
username: daemon uid: 2
username: adm uid: 3
username: lp uid: 4
username: sync uid: 5
username: shutdown uid: 6
username: halt uid: 7
username: mail uid: 8
username: operator uid: 11
username: games uid: 12
username: ftp uid: 14
[root@KOU ~]#
[root@KOU ~]#
[root@KOU ~]# awk -F: '{printf "username: %+11s uid: %d\n",$1,$3}' /etc/passwd | head -12
username: root uid: 0
username: bin uid: 1
username: daemon uid: 2
username: adm uid: 3
username: lp uid: 4
username: sync uid: 5
username: shutdown uid: 6
username: halt uid: 7
username: mail uid: 8
username: operator uid: 11
username: games uid: 12
username: ftp uid: 14
[root@KOU ~]#
15> 判断系统中所有用户的ID号,如果ID号大于1000,就显示为普通用户;小于1000就显示为系统用户;
[root@KOU ~]#
[root@KOU ~]# gawk -F: '{$3>=1000?usertype="common user.":usertype="sysadmin or sysuser";printf "%-22s:%-8s:%-s\n",$1,$3,usertype}' /etc/passwd
root :0 :sysadmin or sysuser
bin :1 :sysadmin or sysuser
daemon :2 :sysadmin or sysuser
adm :3 :sysadmin or sysuser
lp :4 :sysadmin or sysuser
sync :5 :sysadmin or sysuser
shutdown :6 :sysadmin or sysuser
..........
rpcuser :29 :sysadmin or sysuser
nfsnobody :65534 :common user.
sssd :992 :sysadmin or sysuser
tcpdump :72 :sysadmin or sysuser
maha :1001 :common user.
qemu :107 :sysadmin or sysuser
usbmuxd :113 :sysadmin or sysuser
saslauth :991 :sysadmin or sysuser
radvd :75 :sysadmin or sysuser
unbound :990 :sysadmin or sysuser
avahi :70 :sysadmin or sysuser
gnome-initial-setup :989 :sysadmin or sysuser
a1 :1002 :common user.
a2 :1003 :common user.
.........
16> PATTER模式匹配;
匹配指定字符串的行;
[root@KOU ~]#
[root@KOU ~]# awk '/^UUID/{print $1}' /etc/fstab
UUID=cf39f560-952f-4328-9110-c0dc20265fae
UUID=a9c73f6f-3e2f-40d8-8c20-d2421bb15e88
UUID=e68723d4-44ce-4fde-a3e9-816e5d6d4f0c
UUID=db46ba65-2bb9-49f8-8c89-c1ac8cb4c9be
[root@KOU ~]#
对匹配模式取反;
[root@KOU ~]# awk '!/^UUID/{print $1}' /etc/fstab
#
#
#
#
#
#
#
/dev/mapper/KOU-usr
[root@KOU ~]#
-------------------------------------------------------------
找出系统中ID号大于等于1000的用户,显示用户名、ID号;
[root@KOU ~]#
[root@KOU ~]# awk -F: '$3>=1000{printf "%-22s:%-s\n",$1,$3}' /etc/passwd
kou :1000
nfsnobody :65534
maha :1001
a1 :1002
a2 :1003
a3 :1004
a4 :1005
a5 :1006
a6 :1007
a7 :1008
a8 :1009
a9 :1010
a10 :1011
.............
---------------------------------
找出系统中ID号小于1000的用户,显示用户名、ID号;
[root@KOU ~]# awk -F: '$3<1000{printf "%-22s:%-s\n",$1,$3}' /etc/passwd
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
systemd-network :192
dbus :81
polkitd :999
postfix :89
sshd :74
tss :59
geoclue :998
...............
找出系统用户中的登录shell为bash的用户,并显示用户名、登录shell名;
[root@KOU ~]#
[root@KOU ~]# awk -F: '$NF=="/bin/bash"{print $1,$7}' /etc/passwd
root /bin/bash
kou /bin/bash
maha /bin/bash
a1 /bin/bash
a2 /bin/bash
a3 /bin/bash
a4 /bin/bash
a5 /bin/bash
a6 /bin/bash
a7 /bin/bash
a8 /bin/bash
a9 /bin/bash
..............
[root@KOU ~]# awk -F: '$NF=="/bin/bash"{printf "%-22s:%-s\n", $1,$7}' /etc/passwd
root :/bin/bash
kou :/bin/bash
maha :/bin/bash
a1 :/bin/bash
a2 :/bin/bash
a3 :/bin/bash
a4 :/bin/bash
a5 :/bin/bash
a6 :/bin/bash
a7 :/bin/bash
a8 :/bin/bash
a9 :/bin/bash
a10 :/bin/bash
9 :/bin/bash
10 :/bin/bash
dd1 :/bin/bash
dd2 :/bin/bash
...............
-----------------------------------------
[root@KOU ~]#
[root@KOU ~]# awk -F: '$NF~/bash$/{printf "%-22s %-s\n", $1,$7}' /etc/passwd
root /bin/bash
kou /bin/bash
maha /bin/bash
a1 /bin/bash
a2 /bin/bash
a3 /bin/bash
a4 /bin/bash
a5 /bin/bash
a6 /bin/bash
a7 /bin/bash
a8 /bin/bash
a9 /bin/bash
..........
17> 模式匹配:地址定界;
[root@KOU ~]#
[root@KOU ~]# awk -F: '/^b/,/^s/{print $1}' /etc/passwd
bin
daemon
adm
lp
sync
[root@KOU ~]#
[root@KOU ~]# awk -F: 'NR>=2&&NR<=10{print $1}' /etc/passwd
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
[root@KOU ~]#
[root@KOU ~]# awk -F: '(NR>=2&&NR<=10){print $1}' /etc/passwd
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
[root@KOU ~]#
18> BEGIN/END模式;
[root@KOU ~]#
[root@KOU ~]# head -15 /etc/passwd | awk -F: 'BEGIN{printf " username uid \n-------------------------\n"}{printf "%-18s %-s\n",$1,$3}END{print "--------------------------\n END "}'
username uid
-------------------------
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
systemd-network 192
dbus 81
--------------------------
END
[root@KOU ~]#