三劍客老大"awk"名不虛傳——你所不知道的awk

三劍客老大"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/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章