三剑客老大"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/