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 ~]#