awk命令
awk本身是一种编程语言,完整来讲是绝不能一节课讲完的,这里我们只讲它的常用方法。
基本用法
语法:awk ‘pattern + {action}’ {filenames}。
pattern是匹配模式,action是操作的命令。花括号代表分组,一个分组里可以有多个表达式,就像这样{a=3;count++;}
例1.匹配包含‘oo’的行,并打印第一段:
[root@localhost tmp]# awk -F ':' '/oo/ {print $1}' passwd
root
lp
mail
operator
‘F’选项表示指定输入字符的分隔符,不指定默认以空格分隔。F选项可以是个字符串,也可以是个正则。
例2.使用空格或者逗号分隔,打印第3和6段。
[root@localhost tmp]# awk -F '[ ,]' '{print $3,$6}' ab.txt
6 d
[root@localhost tmp]# cat ab.txt
a b 6,8,ab d
匹配
全文匹配
例1.匹配带有‘oo’的行,并打印第一段:
[root@localhost tmp]# awk -F ':' '/oo/ {print $1}' passwd
root
lp
mail
operator
按段匹配
例2.匹配带有‘’的行,并打印第1,4行:
[root@localhost tmp]# awk -F ':' '$1~/oo/ {print $1,$4}' passwd
root 0
有个小知识点,用逗号连接输出的1,4行,默认是用空格分开,如果要换成别的字符,比如‘#’可以这样:
[root@localhost tmp]# awk -F ':' '$1~/oo/ {print $1"#"$4}' passwd
root#0
匹配多次,结果相加
例3.
[root@localhost tmp]# awk -F ':' '/root/ {print $1,$3,$4} /usr/ {print $1,$5,$6,$7}' passwd
root 0 0
operator 11 0
games games /usr/games /sbin/nologin
比较
一般用法
例1.打印第三段大于1000的行。
[root@localhost tmp]# awk -F ':' '$3>1000 {print $0}' passwd
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
注意,这里改成这样$>”1000″——加双引号表示的意义很不一样,如果换成$>”1000″将能匹配出所有,因为它会按首字母的ascii码来算。
字段之间的比较
打印第三段大于第四段的行:
[root@localhost tmp]# awk -F ':' '$3>$4 {print $1,$3,$4}' passwd
sync 5 0
shutdown 6 0
halt 7 0
可以使用逻辑关系。
例2:打印第三段比第四段大的,并且第7段是“/sbin/nologin”的行。
[root@localhost tmp]# awk -F ':' '$3>$4 || $7=="/sbin/nologin" {print $1,$3,$7}' passwd
bin 1 /sbin/nologin
daemon 2 /sbin/nologin
adm 3 /sbin/nologin
lp 4 /sbin/nologin
sync 5 /bin/sync
几个变量
OFS
例1.指定连接输出字段的默认字符:
[root@localhost tmp]# awk -F ':' '{OFS="#"} $3>1000 {print $1,$3}' passwd
nobody#65534
NR
NR(number of row)表示行号。
例1.选择第20到第30行
[root@localhost tmp]# awk -F ':' '{if(NR>=20 && NR<=30) print $0}' passwdpolkitd:x:998:996:User for polkitd:/:/sbin/nologin
sssd:x:997:994:User for sssd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
nginx:x:996:993:Nginx web server:/var/lib/nginx:/sbin/nologin
和我们用cat -n命令查到的结果一致:
[root@localhost tmp]# cat -n passwd
.......
20 polkitd:x:998:996:User for polkitd:/:/sbin/nologin
21 sssd:x:997:994:User for sssd:/:/sbin/nologin
22 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
23 nginx:x:996:993:Nginx web server:/var/lib/nginx:/sbin/nologin
NF
NF表示字段数(number of field)。
例1.显示1-10行的行号和列数。
我们先修改passwd文件如下:
[root@localhost tmp]# cat -n passwd
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 7:8:9
4 ab:cd
5 daemon:x:2:2:daemon:/sbin:/sbin/nologin
6 adm:x:3:4:adm:/var/adm:/sbin/nologin
7 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
8 sync:x:5:0:sync:/sbin:/bin/sync
9 6
10 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
使用awk命令:
[root@localhost tmp]# awk -F ':' 'NR<10 {print NR":"NF}' passwd
1:7
2:7
3:3
4:2
5:7
6:7
7:7
8:7
9:1
运行结果符合预期。
BEGIN和END
BEGIN用来输出或者定义初始信息,END用来显示摘要,结果。
例1.输出用户人数。
[root@localhost tmp]# awk -F ':' 'BEGIN {count=0;print "count=0"} {count++;} END{print count}' passwd
count=0
25
解析:awk是一行一行执行的。执行前,BEGIN里的内容先执行,定义好count变量,输出初始信息。中间的部分是循环处理。最后END部分输出结果。
例2.统计home文件夹下文件总大小。
ls -la|awk 'BEGIN{size=0} {size=size+$5} END{print size}'
50292
awk的内容有很多,大家入门的话先掌握这些就够用了。到后面了解的多了,有需要再去查资料吧。