shell

shell.4.2 GNU/AWK(基础应用:举例)

 

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

 

Leave a Reply

Your email address will not be published. Required fields are marked *