三剑客老大"awk"名不虚传

                                           ——你所不知道的awk

    我们都知道awk做统计非常方便,但是你知道awk也可以用于替换么?我们可以用awk实现sed的功能,甚至比sed更精确(因为可以精确到列)。

    例如:将配置文件的第5行和第7行注释:

[root@oldboyedu-39 ~]# awk 'NR>4&&NR<8{gsub(/^/,"#")}{print NR,$0}' passwd.txt

1  root:x:0:0:root:/root:/bin/bash

3  bin:x:1:1:bin:/bin:/sbin/nologin

5 # daemon:x:2:2:daemon:/sbin:/sbin/nologin

6 #

7 # adm:x:3:4:adm:/var/adm:/sbin/nologin

9    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

10 

11  sync:x:5:0:sync:/sbin:/bin/sync

12 

13  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

14 

15  halt:x:7:0:halt:/sbin:/sbin/halt

16  

17  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

18  uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

例如:删除每行开头的所有空格

[root@oldboyedu-39 ~]# awk '{gsub(/^[ ]+/,"")}{print}' passwd.txt

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


mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

把所有小写字母用括号()括起来

[root@oldboyedu-39 ~]# awk '{gsub(/[a-z]/,"(&)")}{print}' passwd.txt

 (r)(o)(o)(t):(x):0:0:(r)(o)(o)(t):/(r)(o)(o)(t):/(b)(i)(n)/(b)(a)(s)(h)


 (b)(i)(n):(x):1:1:(b)(i)(n):/(b)(i)(n):/(s)(b)(i)(n)/(n)(o)(l)(o)(g)(i)(n)


 (d)(a)(e)(m)(o)(n):(x):2:2:(d)(a)(e)(m)(o)(n):/(s)(b)(i)(n):/(s)(b)(i)(n)/(n)(o)(l)(o)(g)(i)(n)


 (a)(d)(m):(x):3:4:(a)(d)(m):/(v)(a)(r)/(a)(d)(m):/(s)(b)(i)(n)/(n)(o)(l)(o)(g)(i)(n)


   (l)(p):(x):4:7:(l)(p):/(v)(a)(r)/(s)(p)(o)(o)(l)/(l)(p)(d):/(s)(b)(i)(n)/(n)(o)(l)(o)(g)(i)(n)


 (s)(y)(n)(c):(x):5:0:(s)(y)(n)(c):/(s)(b)(i)(n):/(b)(i)(n)/(s)(y)(n)(c)


 (s)(h)(u)(t)(d)(o)(w)(n):(x):6:0:(s)(h)(u)(t)(d)(o)(w)(n):/(s)(b)(i)(n):/(s)(b)(i)(n)/(s)(h)(u)(t)(d)(o)(w)(n)


 (h)(a)(l)(t):(x):7:0:(h)(a)(l)(t):/(s)(b)(i)(n):/(s)(b)(i)(n)/(h)(a)(l)(t)

 

 (m)(a)(i)(l):(x):8:12:(m)(a)(i)(l):/(v)(a)(r)/(s)(p)(o)(o)(l)/(m)(a)(i)(l):/(s)(b)(i)(n)/(n)(o)(l)(o)(g)(i)(n)

 (u)(u)(c)(p):(x):10:14:(u)(u)(c)(p):/(v)(a)(r)/(s)(p)(o)(o)(l)/(u)(u)(c)(p):/(s)(b)(i)(n)/(n)(o)(l)(o)(g)(i)(n)

再例如:将第一列用户名部分的所有小写字母用()括起来

[root@oldboyedu-39 ~]# awk -F: -vOFS=":" '{gsub(/[a-z]+/,"(&)",$1)}{print}' passwd.txt

 (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

 

 (mail):x:8:12:mail:/var/spool/mail:/sbin/nologin

 (uucp):x:10:14:uucp:/var/spool/uucp:/sbin/nologin

补充一个参数:以上操作都只是在内存中(模式空间)的操作,如果需要写入磁盘,需要安装最新版

[root@oldboyedu-39 ~]# awk --version|head -1

GNU Awk 4.1.4, API: 1.1

然后参数是:-i inplace

最新版awk下载地址:

http://ftp.gnu.org/gnu/gawk/