AWK向来以它的便捷著称,过滤内容一步到位。
awk 是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。
awk的处理文本和数据的方式是这样的,它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。
如果没有指定处理动作,则把匹配的行显示到标准输出 (屏幕),如果没有指定模式,则所有被操作所指定的行都被处理。
记录与字段
$0:awk变量$0保存当前记录的内容 # awk -F: '{print $0}' /etc/passwd
NR:每条记录的记录号,每处理完一条记录,NR值加1 # awk -F: '{print NR, $0}'/etc/passwd
NF:保存记录的字段数,$1,$2...$100 #awk -F: '{print $0,NF}' /etc/passwd
FS:输入字段分隔符,默认空格 #awk -F: '/alice/{print $1, $3}' /etc/passwd
#awk -F'[ :\t]' '{print $1,$2,$3}' /etc/passwd //使用多个字段分隔符
OFS:输出字段分隔符 #awk -F: '/alice/{print $1,$2,$3,$4}' /etc/passwd
#awk -F: 'BEGIN{OFS="+++"} /^root/{print $1,$2,$3,$4}' /etc/passwd
awk工作原理
# awk -F: '{print $1,$3}' /etc/passwd //以“:”为分隔符,显示一三列
(1)awk使用一行作为输入,并将这一行赋给内部变量$0,每一行也可称为一个记录,以换行符结束
(2)然后,行被空格分解成字段(或域),每个字段存储在已编号的变量中,从$1开始,最多达100个字段
(3)awk如何知道空格是用来分隔字段的呢?因为有一个内部变量FS来确定字段的分隔符。初始时,FS被赋为空格
(4)awk打印字段时,将以设置的方法使用print函数打印
awk在打印的字段间加上空格,因为$1,$3之间有一个逗号。逗号比较特殊,它映射为另一个内部变量,称为输出字段分隔符OFS,OFS默认为空格
逗号被OFS变量中存储的字符替换
(5)awk输出之后,将从文件中获取另一行,并将其存储在$0中,覆盖原来的内容,然后将新的字符串分隔成字段并进行处理。该过程将持续到所有行处理完毕
例子2:
awk -F: '{max=($3 > $4) ? $3: $4;print max}' /etc/passwd
如果第3个字段的值大于第4个字段的值,则把问号后那个表达式的值赋给max,否则就将冒号后那个表达式的值赋给max;
awk '!($2 < 100 && $3 <20)' filename
如果两个条件为真,awk将否定该表达式并取消对该行的打印;
分支语句
if/else和else if语句
awk -F: '{if($3==0){i++} elseif($3>499){k++} else{j++}} END{print "管理员个数: "i; print "普通用个数: "k; print "系统用户: "j}' /etc/passwd
管理员个数: 1
普通用个数: 34
系统用户: 36
循环:
while
awk -F: '{i=1; while(i<=10) {print$0; i++}}' /etc/passwd //将每行打印10次
for
awk -F: '{for(i=1;i<=10;i++) print $0}'/etc/passwd //将每行打印10次
数组:
# awk -F: '{username[x++]=$1}END{for(i=0;i<NR;i++) print i,username[i]}' /etc/passwd
0 root
1 bin
2 daemon
3 adm
4 lp
统计某列出现的次数
例如:统计网址出现次数,并排序
[root@www www]# cat bai
http://blog.163.com/awk_sed/blog/static/
http://my.zhaopin.com/myzhaopin/resume_index.asp
http://blog.163.com/awk_sed/blog/static/
http://blog.163.com/awk_sed/blog/static/
http://nginxs.blog.51cto.com/
http://blog.163.com/awk_sed/blog/static/
http://nginxs.blog.51cto.com/
#awk -F/ '{a[$3]++}END{for(i in a)print a[i],i}'bai|sort –r
4 blog.163.com
3 nginxs.blog.51cto.com
1 my.zhaopin.com
首先”-F/”就是以“/”为分隔符。