三劍客老大"awk"名不虛傳bash
——你所不知道的awkide
咱們都知道awk作統計很是方便,可是你知道awk也能夠用於替換麼?咱們能夠用awk實現sed的功能,甚至比sed更精確(由於能夠精確到列)。spa
例如:將配置文件的第5行和第7行註釋:內存
[root@oldboyedu-39 ~]# awk 'NR>4&&NR<8{gsub(/^/,"#")}{print NR,$0}' passwd.txtget
1 root:x:0:0:root:/root:/bin/bashit
2 io
3 bin:x:1:1:bin:/bin:/sbin/nologinclass
4 awk
5 # daemon:x:2:2:daemon:/sbin:/sbin/nologinftp
6 #
7 # adm:x:3:4:adm:/var/adm:/sbin/nologin
8
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/