系统运维-17-1-GNU的awk基础知识

1.初步认识awk命令

which awk查看awk命令路径。ls -l /usr/bin/awk查看命令的链接指向。man gawk | grep ^NAME -A1查看帮助手册的解释。cat /etc/fstab | grep UUID查看准备进行测试的测试文档(注意UUID也可能是多行,根据自己的电脑情况确定,不是死板的)。

[root@lab1 ~]# which awk
/usr/bin/awk
[root@lab1 ~]# ls -l /usr/bin/awk
lrwxrwxrwx. 1 root root 4 Dec  5 07:16 /usr/bin/awk -> gawk
[root@lab1 ~]# man gawk | grep ^NAME -A1
NAME
       gawk - pattern scanning and processing language
[root@lab1 ~]# cat /etc/fstab | grep UUID
UUID=0ee0448e-a0b8-4ade-8236-620c46e00461 /boot                   xfs     defaults        0 0

 

2.关于print命令的使用

cat /etc/fstab | grep UUID | awk '{print $2,$4}'取第2个切片和第4个切片(默认空白作为切片分割符,注意逗号为分隔显示)。cat /etc/fstab | grep UUID | awk '{print $2 $4}'取第2个切片和第4个切片(合并显示)。grep UUID /etc/fstab | awk '{print "hello",$2,$4,6}'取第2个切片和第4个切片,并在首尾增加字符输出。grep UUID /etc/fstab | awk '{print "hello:$1"}'在引号内将不被解析。grep UUID /etc/fstab | awk '{print "hello:"$1}'引号外部可以解析。grep UUID /etc/fstab | awk '{print}'不定义则默认全部切片输出。grep UUID /etc/fstab | awk '{print ""}'也可以用空白进行整合打印输出。

[root@lab1 ~]# cat /etc/fstab | grep UUID | awk '{print $2,$4}'
/boot defaults
[root@lab1 ~]# cat /etc/fstab | grep UUID | awk '{print $2 $4}'
/bootdefaults

[root@lab1 ~]# grep UUID /etc/fstab | awk '{print "hello",$2,$4,6}'
hello /boot defaults 6
[root@lab1 ~]# grep UUID /etc/fstab | awk '{print "hello:$1"}'
hello:$1
[root@lab1 ~]# grep UUID /etc/fstab | awk '{print "hello:"$1}'
hello:UUID=0ee0448e-a0b8-4ade-8236-620c46e00461
[root@lab1 ~]# grep UUID /etc/fstab | awk '{print}'
UUID=0ee0448e-a0b8-4ade-8236-620c46e00461 /boot                   xfs     defaults        0 0
[root@lab1 ~]# grep UUID /etc/fstab | awk '{print ""}'

3.关于切片分隔符的使用

awk '{print $1}' /etc/passwd | head -5显示第一个切片(默认空白作为切片分隔符)。awk -v FS=':' '{print $1}' /etc/passwd | head -5指定冒号作为分隔符。awk -F: '{print $1}' /etc/passwd | head -5也上一句相同。 awk -F: '{print $1,$3,$5}' /etc/passwd | head -5显示多个切片。awk -F: -v OFS=':' '{print $1,$3,$5}' /etc/passwd | head -5指定输出的分隔符为冒号。awk -v RS='/' '{print}' /etc/passwd | head -5指定换行符为斜杠。awk -v RS='/' -v ORS='#' '{print}' /etc/passwd | head -5将换行符输出为井号。

[root@lab1 ~]# awk '{print $1}' /etc/passwd | head -5
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
[root@lab1 ~]# awk -v FS=':' '{print $1}' /etc/passwd | head -5
root
bin
daemon
adm
lp
[root@lab1 ~]# awk -F: '{print $1}' /etc/passwd | head -5
root
bin
daemon
adm
lp
[root@lab1 ~]# awk -F: '{print $1,$3,$5}' /etc/passwd | head -5
root 0 root
bin 1 bin
daemon 2 daemon
adm 3 adm
lp 4 lp
[root@lab1 ~]# awk -F: -v OFS=':' '{print $1,$3,$5}' /etc/passwd | head -5
root:0:root
bin:1:bin
daemon:2:daemon
adm:3:adm
lp:4:lp
[root@lab1 ~]# awk -v RS='/' '{print}' /etc/passwd | head -5
root:x:0:0:root:
root:
bin
bash
bin:x:1:1:bin:
[root@lab1 ~]# awk -v RS='/' -v ORS='#' '{print}' /etc/passwd | head -5
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
 

3.关于切片的参数

awk '{print NF}' /etc/fstab显示每行的切片数量。awk '{print $NF}' /etc/fstab显示第NF个切片。awk '{print NR}' /etc/fstab显示切片的累计行数。awk '{print NR}' /etc/fstab /etc/issue支持多个文件(默认为接续模式)。awk '{print FNR}' /etc/fstab /etc/issue改为重记模式。awk '{print FILENAME}' /etc/fstab /etc/issue支持显示切片的文件名。awk '{print ARGC}' /etc/fstab /etc/issue支持显示命令参数个数。awk 'BEGIN{print ARGC}' /etc/fstab /etc/issue不进行逐行计列。awk 'BEGIN{print ARGV[0]}' /etc/fstab /etc/issue显示第1个参数。awk 'BEGIN{print ARGV[1]}' /etc/fstab /etc/issue显示第2个参数。awk 'BEGIN{print ARGV[2]}' /etc/fstab /etc/issue显示第3个参数。

[root@lab1 ~]# awk '{print NF}' /etc/fstab
0
1
2
10
1
9
12
1
6
6
6

[root@lab1 ~]# awk '{print $NF}' /etc/fstab

#
/etc/fstab
2018
#
'/dev/disk'
info
#
0
0
0
[root@lab1 ~]# awk '{print NR}' /etc/fstab
1
2
3
4
5
6
7
8
9
10
11
[root@lab1 ~]# awk '{print NR}' /etc/fstab /etc/issue
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@lab1 ~]# awk '{print FNR}' /etc/fstab /etc/issue
1
2
3
4
5
6
7
8
9
10
11
1
2
3
[root@lab1 ~]# awk '{print FILENAME}' /etc/fstab /etc/issue
/etc/fstab
/etc/fstab
/etc/fstab
/etc/fstab
/etc/fstab
/etc/fstab
/etc/fstab
/etc/fstab
/etc/fstab
/etc/fstab
/etc/fstab
/etc/issue
/etc/issue
/etc/issue
[root@lab1 ~]# awk '{print ARGC}' /etc/fstab /etc/issue
3
3
3
3
3
3
3
3
3
3
3
3
3
3
[root@lab1 ~]# awk 'BEGIN{print ARGC}' /etc/fstab /etc/issue
3
[root@lab1 ~]# awk 'BEGIN{print ARGV[0]}' /etc/fstab /etc/issue
awk
[root@lab1 ~]# awk 'BEGIN{print ARGV[1]}' /etc/fstab /etc/issue
/etc/fstab
[root@lab1 ~]# awk 'BEGIN{print ARGV[2]}' /etc/fstab /etc/issue
/etc/issue
 

4.自定义变量

awk -v test='hello gawk' '{print test}' /etc/fstab这里可以有多少行,就输出多少个hello gawk。awk -v test='hello gawk' 'BEGIN{print test}'也可以将重复输出变为一个。[root@lab1 ~]# awk 'BEGIN{test="hello gawk";print test}'
hello gawk也可以将赋值语句放在内部。

[root@lab1 ~]# awk -v test='hello gawk' '{print test}' /etc/fstab
hello gawk
hello gawk
hello gawk
hello gawk
hello gawk
hello gawk
hello gawk
hello gawk
hello gawk
hello gawk
hello gawk
[root@lab1 ~]# awk -v test='hello gawk' 'BEGIN{print test}'
hello gawk
 

5.printf命令

基础知识:%c显示字符的ascii码,%d显示十进制数字,%i显示整数,%e科学计数法显示,%f显示浮点数,%s显示字符串,%u无符号数,%%显示%自身(逃逸符)。

awk -F: '{print $1}' /etc/passwd | head -5指定分隔符查看输出。awk -F: '{printf "%s",$1}' /etc/passwd查看输出(注意这里不自动换行)。awk -F: '{printf "%s\n",$1}' /etc/passwd | head -5增加换行符输出。awk -F: '{printf "Username: %s, UID: %d\n",$1,$3}' /etc/passwd | head -5增加字符串和多参数输出。

[root@lab1 ~]# awk -F: '{print $1}' /etc/passwd | head -5
root
bin
daemon
adm
lp
[root@lab1 ~]# awk -F: '{printf "%s",$1}' /etc/passwd
rootbindaemonadmlpsyncshutdownhaltmailoperatorgamesftpnobodysystemd-networkdbuspolkitdpostfixsshdchronystudentapacheuser1user2user4user6user7user8user9user10user3user5dockermyusermyuser1myuser2myuser3myuser4myuser5myuser6myuser7myuser8myuser9myuser10

[root@lab1 ~]# awk -F: '{printf "%s\n",$1}' /etc/passwd | head -5
root
bin
daemon
adm
lp
[root@lab1 ~]# awk -F: '{printf "Username: %s\n",$1}' /etc/passwd | head -5
Username: root
Username: bin
Username: daemon
Username: adm
Username: lp
[root@lab1 ~]# awk -F: '{printf "Username: %s, UID: %d\n",$1,$3}' /etc/passwd | head -5
Username: root, UID: 0
Username: bin, UID: 1
Username: daemon, UID: 2
Username: adm, UID: 3
Username: lp, UID: 4

6.修饰符

基础知识:#[.#]第一个数字显示宽度,第二个数字显示小数点后精度。 -  表示左对齐。+显示数值符号。

awk -F: '{printf "Username: %15s, UID: %d\n",$1,$3}' /etc/passwd | head -5指定第一个参数值的宽度为15(默认右对齐)并输出。awk -F: '{printf "Username: %-15s, UID: %d\n",$1,$3}' /etc/passwd | head -5指定第一个参数为左对齐。

[root@lab1 ~]# awk -F: '{printf "Username: %15s, UID: %d\n",$1,$3}' /etc/passwd | head -5
Username:            root, UID: 0
Username:             bin, UID: 1
Username:          daemon, UID: 2
Username:             adm, UID: 3
Username:              lp, UID: 4
[root@lab1 ~]# awk -F: '{printf "Username: %-15s, UID: %d\n",$1,$3}' /etc/passwd | head -5
Username: root           , UID: 0
Username: bin            , UID: 1
Username: daemon         , UID: 2
Username: adm            , UID: 3
Username: lp             , UID: 4
 

7.操作符

基础知识:条件表达式,selector?if-ture-expression:if-false-expression

awk -F: '{$3>=1000?usertype="Common User":usertype="Sysadmin or Sysuser";printf "%15s:%-s\n",$1,usertype}' /etc/passwd将条件表达式判断结果进行格式化输出。

[root@lab1 ~]# awk -F: '{$3>=1000?usertype="Common User":usertype="Sysadmin or Sysuser";printf "%15s:%-s\n",$1,usertype}' /etc/passwd
           root:Sysadmin or Sysuser
            bin:Sysadmin or Sysuser
         daemon:Sysadmin or Sysuser
            adm:Sysadmin or Sysuser
             lp:Sysadmin or Sysuser
           sync:Sysadmin or Sysuser
       shutdown:Sysadmin or Sysuser
           halt:Sysadmin or Sysuser
           mail:Sysadmin or Sysuser
       operator:Sysadmin or Sysuser
          games:Sysadmin or Sysuser
            ftp:Sysadmin or Sysuser
         nobody:Sysadmin or Sysuser
systemd-network:Sysadmin or Sysuser
           dbus:Sysadmin or Sysuser
        polkitd:Sysadmin or Sysuser
        postfix:Sysadmin or Sysuser
           sshd:Sysadmin or Sysuser
         chrony:Sysadmin or Sysuser
        student:Common User
         apache:Sysadmin or Sysuser
          user1:Common User
          user2:Common User
          user4:Common User
          user6:Common User
          user7:Common User
          user8:Common User
          user9:Common User
         user10:Common User
          user3:Common User
          user5:Common User
         docker:Common User
         myuser:Common User
        myuser1:Common User
        myuser2:Common User
        myuser3:Common User
        myuser4:Common User
        myuser5:Common User
        myuser6:Common User
        myuser7:Common User
        myuser8:Common User
        myuser9:Common User
       myuser10:Common User
 

8.匹配

基础知识:支持/regular expression/进行正则表达式匹配。如果不定义,则表示为空,即每一行都匹配。BEGIN{}仅在文本处理之前执行一次的模式。END{}仅在文本处理之后执行一次的模式。

awk '/^UUID/{print $1}' /etc/fstab进行匹配输出。awk '!/^UUID/{print $1}' /etc/fstab上述输出取反。awk -F: '$3>=1000{print $1,$3}' /etc/passwd也可以条件判断进行输出。 awk -F: '$NF=="/bin/bash"{print $1,$NF}' /etc/passwd或者匹配输出是一样的效果。awk -F: '/^h/,/^u/{print $1}' /etc/passwd可以进行起止行匹配。awk -F: '(NR>=2&&NR<=10){print $1}' /etc/passwd也可以指定行号进行匹配。awk -F: 'BEGIN{print "     username       uid    \n---------------------------"}'测试前端输出。 awk -F: 'BEGIN{print "     username       uid    \n---------------------------"}{print $1,$3}' /etc/passwd | head -5查看前端输出效果。awk -F: '{print "     username       uid    \n---------------------------";print $1,$3}' /etc/passwd | head -5取消前端输出变为逐行输出。awk -F: 'BEGIN{print "     username       uid    \n---------------------------"}{print $1,$3}END{print "====================\nend"}' /etc/passwd | tail -5查看后端输出效果。

[root@lab1 ~]# awk '/^UUID/{print $1}' /etc/fstab
UUID=0ee0448e-a0b8-4ade-8236-620c46e00461

[root@lab1 ~]# awk '!/^UUID/{print $1}' /etc/fstab

#
#
#
#
#
#
#
/dev/mapper/centos-root
/dev/mapper/centos-swap
[root@lab1 ~]# awk -F: '$3>=1000{print $1,$3}' /etc/passwd
student 1000
user1 1001
user2 1002
user4 1004
user6 1006
user7 1007
user8 1008
user9 1009
user10 1010
user3 1011
user5 1012
docker 1013
myuser 1014
myuser1 1015
myuser2 1016
myuser3 1017
myuser4 1018
myuser5 1019
myuser6 1020
myuser7 1021
myuser8 1022
myuser9 1023
myuser10 1024

[root@lab1 ~]# awk -F: '$NF=="/bin/bash"{print $1,$NF}' /etc/passwd
root /bin/bash
student /bin/bash
user1 /bin/bash
user2 /bin/bash
user4 /bin/bash
user6 /bin/bash
user7 /bin/bash
user8 /bin/bash
user9 /bin/bash
user10 /bin/bash
user3 /bin/bash
user5 /bin/bash
docker /bin/bash
myuser /bin/bash
myuser1 /bin/bash
myuser2 /bin/bash
myuser3 /bin/bash
myuser4 /bin/bash
myuser5 /bin/bash
myuser6 /bin/bash
myuser7 /bin/bash
myuser8 /bin/bash
myuser9 /bin/bash
myuser10 /bin/bash

[root@lab1 ~]# awk -F: '$NF~/bash$/{print $1,$NF}' /etc/passwd
root /bin/bash
student /bin/bash
user1 /bin/bash
user2 /bin/bash
user4 /bin/bash
user6 /bin/bash
user7 /bin/bash
user8 /bin/bash
user9 /bin/bash
user10 /bin/bash
user3 /bin/bash
user5 /bin/bash
docker /bin/bash
myuser /bin/bash
myuser1 /bin/bash
myuser2 /bin/bash
myuser3 /bin/bash
myuser4 /bin/bash
myuser5 /bin/bash
myuser6 /bin/bash
myuser7 /bin/bash
myuser8 /bin/bash
myuser9 /bin/bash
myuser10 /bin/bash
[root@lab1 ~]# awk -F: '/^h/,/^u/{print $1}' /etc/passwd
halt
mail
operator
games
ftp
nobody
systemd-network
dbus
polkitd
postfix
sshd
chrony
student
apache
user1
[root@lab1 ~]# awk -F: '(NR>=2&&NR<=10){print $1}' /etc/passwd
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
[root@lab1 ~]# awk -F: 'BEGIN{print "     username       uid    \n---------------------------"}'
     username       uid    
---------------------------

[root@lab1 ~]# awk -F: 'BEGIN{print "     username       uid    \n---------------------------"}{print $1,$3}' /etc/passwd | head -5
     username       uid    
---------------------------
root 0
bin 1
daemon 2
[root@lab1 ~]# awk -F: '{print "     username       uid    \n---------------------------";print $1,$3}' /etc/passwd | head -5
     username       uid    
---------------------------
root 0
     username       uid    
---------------------------
[root@lab1 ~]# awk -F: 'BEGIN{print "     username       uid    \n---------------------------"}{print $1,$3}END{print "====================\nend"}' /etc/passwd | tail -5
myuser8 1022
myuser9 1023
myuser10 1024
====================
end
 

猜你喜欢

转载自blog.csdn.net/ligan1115/article/details/85950343